java - দুই দশমিক স্থানগুলিতে ডাবল গোল করা




double rounding (9)

আপনার প্রশ্নে, মনে হচ্ছে যে আপনি সংখ্যাগুলিও ঘিরে রাখতে চান? আমি মনে করি .format () আধা-আপ, afaik ব্যবহার করে সংখ্যা বৃত্তাকার হবে?
তাই যদি আপনি রাউন্ড করতে চান তবে 200.3456 অবশ্যই ২.3 এর নির্ভুলতার জন্য 200.35 হওয়া উচিত তবে আপনার ক্ষেত্রে, যদি আপনি শুধুমাত্র প্রথম 2 চান এবং তারপর বাকিগুলি বাতিল করেন?

100 দ্বারা বিভক্ত করার আগে আপনি এটি 100 দ্বারা গুণমান করতে পারেন এবং তারপরে একটি int (বা সংখ্যাটির তল) গ্রহণ করেন।

200.3456 * 100 = 20034.56;  
(int) 20034.56 = 20034;  
20034/100.0 = 200.34;

যদিও আপনি সীমানা কাছাকাছি সত্যিই সত্যিই বড় সংখ্যা সঙ্গে সমস্যা হতে পারে। কোন ক্ষেত্রে স্ট্রিং এবং substring'ing রূপান্তর এটি সহজে কাজ করবে।

https://code.i-harness.com

এই প্রশ্নটি ইতিমধ্যে একটি উত্তর আছে:

মান 200.3456 , এটি 200.34 বিন্যাস করা উচিত। এটি 200 , এটি 200.00 হওয়া উচিত।


আপনি যদি সত্যিই একই দ্বিগুণ চান তবে উদাহরণস্বরূপ আপনি বৃত্তাকার ভাবে বিগডিসিমাল ব্যবহার করতে পারেন

new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();

একটি ডবল গোলাকার সাধারণত এক চায় কি না। পরিবর্তে, পছন্দসই বিন্যাসে এটি উপস্থাপন করার জন্য String.format() ব্যবহার করুন।


এখানে একটি ইউটিলিটি যা রাউন্ডগুলি (পরিবর্তনের পরিবর্তে) দশমিক স্থানগুলির নির্দিষ্ট সংখ্যায় ডাবল।

উদাহরণ স্বরূপ:

round(200.3456, 2); // returns 200.35

মূল সংস্করণ; এই সঙ্গে দেখুন

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
}

এটি কোণার ক্ষেত্রে খুব বেশি সংখ্যক দশমিক স্থান (যেমন round(1000.0d, 17) ) বা বড় পূর্ণসংখ্যা অংশ (যেমন round(90080070060.1d, 9) ) এর সাথে খারাপভাবে ভেঙ্গে যায় । এই ইঙ্গিত জন্য Sloin ধন্যবাদ।

আমি উপরের কয়েকটি বছর ধরে সুখীভাবে 2 বা 3 দশমিক স্থানগুলিতে "খুব বেশি বড়" রাউন্ডে যেতে ব্যবহার করছি না (উদাহরণস্বরূপ লগিংয়ের উদ্দেশ্যে সেকেন্ডে সময় পরিষ্কার করতে: 27.987654321987 -> 27.99)। কিন্তু আমি মনে করি এটিকে এড়াতে এটি সর্বোত্তম, কারণ আরো নির্ভরযোগ্য উপায়গুলি সহজেই ক্লিনার কোড সহ পাওয়া যায়।

সুতরাং, পরিবর্তে এই ব্যবহার করুন

( এই উত্তরটি লুই ওয়েসারম্যানের দ্বারা এবং সিয়ান ওওয়েনের এই অনুচ্ছেদ থেকে গৃহীত ।)

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

উল্লেখ্য যে HALF_UP বৃত্তাকার মোড "সাধারণত স্কুলে শেখানো হয়"। রাউন্ডিংমোড ডকুমেন্টেশনটি দেখুন , যদি আপনি সন্দেহ করেন যে আপনাকে ব্যাঙ্কারদের রাউন্ডিংয়ের মতো অন্য কিছু দরকার।

অবশ্যই, যদি আপনি পছন্দ করেন, তবে আপনি উপরে একটি লাইনারের মধ্যে ইনলাইন করতে পারেন:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

এবং প্রতি ক্ষেত্রে

সর্বদা যে ভাসমান বিন্দু উপস্থাপনা float এবং double ব্যবহার অক্ষয় । উদাহরণস্বরূপ, এই এক্সপ্রেশন বিবেচনা করুন:

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

সঠিকতার জন্য, আপনি BigDecimal ব্যবহার করতে চান । এবং যখন এটি, একটি স্ট্রিং লাগে যে কনস্ট্রাকটর ব্যবহার করুন, এক ডবল গ্রহণ না। উদাহরণস্বরূপ, এটি কার্যকর করার চেষ্টা করুন:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

কিছু চমৎকার আরও বিষয় পড়া:

আপনি কঠোরভাবে বৃত্তাকার সংখ্যাগুলির পরিবর্তে স্ট্রিং ফর্ম্যাটিং চেয়েছিলেন (বা তার পাশাপাশি), অন্যান্য উত্তর দেখুন।

বিশেষত, উল্লেখ্য যে round(200, 0) 200.0 । আপনি যদি " 200.00 " আউটপুট করতে চান তবে আপনাকে প্রথমে রাউন্ড করতে হবে এবং তারপরে আউটপুটের ফলাফলটি ফরম্যাট করতে হবে (যা জেসপারের উত্তরে পুরোপুরি ব্যাখ্যা করা হয়েছে)।


যদি আপনি দশমিক বিন্দুর পরে দুই অঙ্কের সাথে একটি double মুদ্রণ করতে চান, তবে এরকম কিছু ব্যবহার করুন:

double value = 200.3456;
System.out.printf("Value: %.2f", value);

আপনি কনসোলে মুদ্রণের পরিবর্তে String.format() ফলাফল পেতে চান তবে একই আর্গুমেন্টগুলির সাহায্যে String.format() ব্যবহার করুন:

String result = String.format("%.2f", value);

অথবা ক্লাস DecimalFormat ব্যবহার করুন:

DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));

সবচেয়ে সহজ উপায়, এই মত একটি কৌশল করতে হবে;

double val = ....;
val = val*100;
val = Math.round(val);
val = val /100;

যদি ভ্যালু 200.3456 এ শুরু হয় তবে এটি 20034.56 হয় তবে এটি 20035 পর্যন্ত বৃত্তাকার হয়ে যায় এবং আমরা 200.34 পেতে এটি ভাগ করে নেব।

যদি আপনি সর্বদা রাউন্ড ডাউন করতে চেয়েছিলেন তবে আমরা সর্বদা একটি int- কে নিক্ষেপ করে ছিনতাই করতে পারি:

double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;

এই পদ্ধতিটি বেশিরভাগ ক্ষেত্রেই কাজ করবে কারণ খুব বড় ডাবলস (ইতিবাচক বা নেতিবাচক) এটি অত্যধিক প্রবাহিত হতে পারে। কিন্তু যদি আপনি জানেন যে আপনার মানগুলি যথাযথ পরিসরে থাকবে তবে এটি আপনার জন্য কাজ করা উচিত।


double d = 28786.079999999998;
String str = String.format("%1.2f", d);
d = Double.valueOf(str);

double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");      
System.out.println(df.format(value));

value = (int)(value * 100 + 0.5) / 100.0;




rounding