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




7 Answers

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

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

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 " আউটপুট করতে চান তবে আপনাকে প্রথমে রাউন্ড করতে হবে এবং তারপরে আউটপুটের ফলাফলটি ফরম্যাট করতে হবে (যা জেসপারের উত্তরে পুরোপুরি ব্যাখ্যা করা হয়েছে)।

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

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




আমি এই সহজ মনে করি:

double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");      
time = Double.valueOf(df.format(time));

System.out.println(time); // 200.35

মনে রাখবেন যে এটি আসলে আপনার জন্য বৃত্তাকার করবে, কেবল ফর্ম্যাট নয়।







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



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

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



দুই বৃত্তাকার সংখ্যা জন্য। খুব সহজ এবং আপনি মূলত পরিবর্তনশীল পরিবর্তনের পরিবর্তে আপডেট করা যা ডিসিমিমফরম্যাটটি প্রদর্শন করে।

x = Math.floor(x * 100) / 100;




আপনার প্রশ্নে, মনে হচ্ছে যে আপনি সংখ্যাগুলিও ঘিরে রাখতে চান? আমি মনে করি .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 রূপান্তর এটি সহজে কাজ করবে।




Related