यदि आप उपयोग करते हैं double
या float
, आपको राउंडिंग का उपयोग करना चाहिए या कुछ राउंडिंग त्रुटियों को देखने की अपेक्षा करनी चाहिए। यदि आप ऐसा नहीं कर सकते, तो उपयोग करें BigDecimal
।
आपके पास समस्या यह है कि 0.1 एक सटीक प्रतिनिधित्व नहीं है, और दो बार गणना करके, आप उस त्रुटि को कम कर रहे हैं।
हालांकि, 100 को सही ढंग से दर्शाया जा सकता है, इसलिए प्रयास करें:
double x = 1234;
x /= 100;
System.out.println(x);
जो प्रिंट करता है:
12.34
यह काम करता है क्योंकि Double.toString(d)
आपकी ओर से थोड़ी मात्रा में गोलाई करता है, लेकिन यह बहुत अधिक नहीं है। यदि आप सोच रहे हैं कि यह बिना गोलाई के कैसा दिख सकता है:
System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));
प्रिंट:
0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375
संक्षेप में, फ़्लोटिंग फ़्लोटिंग पॉइंट में समझदार उत्तरों के लिए अपरिहार्य है कि आप यह स्पष्ट रूप से कर रहे हैं या नहीं।
ध्यान दें: 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