আপনি যদি ব্যবহার করেন double
বা float
, আপনার গোলাকার ব্যবহার করা উচিত বা কিছু গোলাকার ত্রুটি দেখার আশা করা উচিত। আপনি যদি এটি করতে না পারেন তবে ব্যবহার করুনBigDecimal
।
আপনার সমস্যাটি হ'ল 0.1 হুবহু উপস্থাপনা নয় এবং দুবার গণনা সম্পাদন করে আপনি সেই ত্রুটিটিকে আরও জটিল করে তুলছেন।
তবে, 100 সঠিকভাবে উপস্থাপন করা যায়, তাই চেষ্টা করুন:
double x = 1234;
x /= 100;
System.out.println(x);
যা প্রিন্ট করে:
12.34
এটি কাজ করে কারণ Double.toString(d)
আপনার পক্ষ থেকে অল্প পরিমাণে রাউন্ডিং করে তবে এটি খুব বেশি নয় much আপনি যদি ভাবছেন যে গোল না করে এটি দেখতে কেমন দেখাচ্ছে:
System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));
মুদ্রণ:
0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375
সংক্ষেপে, ভাসমান পয়েন্টে বুদ্ধিমান জবাবগুলির জন্য বৃত্তাকারটি অপরিহার্য is
দ্রষ্টব্য: রাউন্ডিং ত্রুটির ক্ষেত্রে x / 100
এবং x * 0.01
ঠিক একই রকম হয় না। কারণ প্রথম প্রকাশের জন্য রাউন্ড ত্রুটিটি x এর মানগুলির উপর নির্ভর করে, যখন 0.01
দ্বিতীয়টিতে একটি নির্দিষ্ট রাউন্ড ত্রুটি থাকে।
for(int i=0;i<200;i++) {
double d1 = (double) i / 100;
double d2 = i * 0.01;
if (d1 != d2)
System.out.println(d1 + " != "+d2);
}
প্রিন্ট
0.35 != 0.35000000000000003
0.41 != 0.41000000000000003
0.47 != 0.47000000000000003
0.57 != 0.5700000000000001
0.69 != 0.6900000000000001
0.7 != 0.7000000000000001
0.82 != 0.8200000000000001
0.83 != 0.8300000000000001
0.94 != 0.9400000000000001
0.95 != 0.9500000000000001
1.13 != 1.1300000000000001
1.14 != 1.1400000000000001
1.15 != 1.1500000000000001
1.38 != 1.3800000000000001
1.39 != 1.3900000000000001
1.4 != 1.4000000000000001
1.63 != 1.6300000000000001
1.64 != 1.6400000000000001
1.65 != 1.6500000000000001
1.66 != 1.6600000000000001
1.88 != 1.8800000000000001
1.89 != 1.8900000000000001
1.9 != 1.9000000000000001
1.91 != 1.9100000000000001