আমার নিম্নলিখিত ফলাফলগুলি দরকার
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
বা .setScale()
? কিভাবে আমি এই সম্পর্কে যান?
উত্তর:
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
একটি নতুন বস্তু ফিরে আসবে।)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
প্রিন্ট মিথ্যা
RoundingMode
এটা কি? এটিBigDecimal
আমি যদি গ্রোড্রিগেজের উত্তর দিয়ে যাই
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
এটি আপাতত আমার সমস্যা সমাধান করে ..:) আপনাকে সবাইকে ধন্যবাদ।
DecimalFormat
(যেমন হিসাবে new DecimalFormat("###.00")
) ব্যবহার করতে পারেন BigDecimal
। এটি "101.00"
উভয় মানের জন্য ফলাফল দেয় যা @Grodriquez থেকে স্নিপেটস এবং আপনি তৈরি করেছেন।
এখানে একটি অত্যন্ত জটিল সমাধান, কিন্তু এটি কাজ করে:
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)
সহজভাবে দেখুন:
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);
আমি মনে করি না যে আপনি এটি একটি কমান্ডের মতো গোল করতে পারেন। চেষ্টা করুন
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
আমি আপনার বাকী উদাহরণগুলির জন্য পরীক্ষা করেছি এবং এটি পছন্দসই মানগুলি ফিরিয়ে দেয় তবে আমি এর সঠিকতার গ্যারান্টি দিচ্ছি না।
তুমি চাও
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
round
: "যদি যথাযথ সেটিং 0 হয় তবে কোনও রাউন্ডিং হয় না।"