জাভা বিগডিসিমাল: নিকটতম সম্পূর্ণ মানকে গোল করে


90

আমার নিম্নলিখিত ফলাফলগুলি দরকার

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round()বা .setScale()? কিভাবে আমি এই সম্পর্কে যান?

উত্তর:


153

setScale()ভগ্নাংশের সংখ্যা শূন্যে হ্রাস করতে আপনি ব্যবহার করতে পারেন । ধরে নেওয়া valueমানটি গোল করে নেওয়া:

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);

ব্যবহার round()করা কিছুটা বেশি জড়িত কারণ এটি আপনাকে ধরে রাখতে হবে যে সংখ্যাগুলির সংখ্যা নির্দিষ্ট করতে হবে। আপনার উদাহরণগুলিতে এটি 3 হবে তবে এটি সমস্ত মানের জন্য বৈধ নয়:

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

(নোট যে BigDecimalবস্তু অপরিবর্তনীয় হয়; উভয় setScaleএবং roundএকটি নতুন বস্তু ফিরে আসবে।)


4
এটি কাজ করছে না: 100.12: 100.12, 100.44: 100.44, 100.50: 100.5, 100.75: 100.75
বোরিস

4
না, সেটিং স্কেল নতুন দশমিকটি দেয় যা প্রথমটির মতো নয়। উদাহরণস্বরূপ: BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));প্রিন্ট মিথ্যা
ড্যানিয়েল ফ্যাথ

6
@ ড্যানিয়েল: এটি আমার উত্তর পোস্ট করা কোড স্নিপেটে ইতিমধ্যে জড়িত ছিল। আমি এখন এটি স্পষ্ট করে তুলেছি।
গ্রোড্রিগেজ

RoundingModeএটা কি? এটিBigDecimal
ট্রিলজি


10

আমি যদি গ্রোড্রিগেজের উত্তর দিয়ে যাই

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

এটি আউটপুট

100.23 -> 100
100.77 -> 101

যা আমি চাই তা পুরোপুরি নয়, তাই আমি এটি শেষ করেছিলাম ..

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

এটাই আমি পাই

100.23 -> 100.00
100.77 -> 101.00

এটি আপাতত আমার সমস্যা সমাধান করে ..:) আপনাকে সবাইকে ধন্যবাদ।


7
আমি বিবৃতিটি সম্পর্কে আগ্রহী যে প্রথম ফলাফলটি "আমি যা চাই তা ঠিক তেমন নয় ..."। আপনি যদি আউটপুট বিন্যাস সম্পর্কে প্রকৃতই উদ্বিগ্ন হন তবে আপনি পিছনে স্ট্রিংয়ের রূপান্তর পরিচালনা করতে DecimalFormat(যেমন হিসাবে new DecimalFormat("###.00")) ব্যবহার করতে পারেন BigDecimal। এটি "101.00"উভয় মানের জন্য ফলাফল দেয় যা @Grodriquez থেকে স্নিপেটস এবং আপনি তৈরি করেছেন।
joel.neely

4
দ্বিতীয়বার আপনি এখানে চারদিকে ঘুরছেন অপ্রয়োজনীয় কারণ আপনি জানেন যে আপনার ইতিমধ্যে একটি পূর্ণসংখ্যা রয়েছে, তাই আমি এর পরিবর্তে বিগডিসিমাল ব্যবহার করব RO
kosmoplan

5

এখানে একটি অত্যন্ত জটিল সমাধান, কিন্তু এটি কাজ করে:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}

পরীক্ষার কোড:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}

আউটপুট:

100
100
101
101


এই সমাধান বা কোনও কিছুর অনুমোদনের জন্য নয়, তবে input.toBigInteger().toString().length()অংশটি লগারিদম ব্যবহার করে আরও কার্যকর হবে, এমন কিছু জিনিসround_up(log(input)) + (1 if input is a power of ten, else 0)
অ্যাডিসন

3

সহজভাবে দেখুন:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

এবং:

setScale(int precision, int roundingMode)

অথবা যদি জাভা 6 ব্যবহার করে থাকেন তবে

http://download.oracle.com/javase/6/docs/api/java/math/ রাউন্ডিং মোড html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

এবং যেভাবেই:

setScale(int precision, RoundingMode mode);
round(MathContext mc);

0

আমি মনে করি না যে আপনি এটি একটি কমান্ডের মতো গোল করতে পারেন। চেষ্টা করুন

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

আমি আপনার বাকী উদাহরণগুলির জন্য পরীক্ষা করেছি এবং এটি পছন্দসই মানগুলি ফিরিয়ে দেয় তবে আমি এর সঠিকতার গ্যারান্টি দিচ্ছি না।


-2

তুমি চাও

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP

4
এটি কিছুই করে না। এর ডকুমেন্টেশন থেকে round: "যদি যথাযথ সেটিং 0 হয় তবে কোনও রাউন্ডিং হয় না।"
গ্রোড্রিগেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.