ऐसा लगता है कि घटाव किसी प्रकार की समस्या को ट्रिगर कर रहा है और परिणामी मान गलत है।जावा राउंडिंग डबल समस्या को हल करने के लिए कैसे करें
double tempCommission = targetPremium.doubleValue()*rate.doubleValue()/100d;
78,75 = 787,5 * 10,0/100D
double netToCompany = targetPremium.doubleValue() - tempCommission;
708,75 = 787,5 - 78,75
double dCommission = request.getPremium().doubleValue() - netToCompany;
877,8499999999999 = 1586,6 - 708.75
जिसके परिणामस्वरूप उम्मीद मूल्य 877.85 होगा।
सही गणना सुनिश्चित करने के लिए क्या किया जाना चाहिए?
कोई रास्ता नहीं है कि आप फ्लोटिंग पॉइंट अंकगणितीय त्रुटियों को "से बचें" पूरी तरह से कर सकते हैं। किसी संख्या का प्रतिनिधित्व करने में उपयोग की जाने वाली बिट्स की संख्या हमेशा सीमित होगी। आप बस उच्च परिशुद्धता (बिट्स) वाले डेटा प्रकारों का उपयोग कर सकते हैं। –
यह सच है। मैं BigDecimal के उपयोग को अधिक सटीक रूप से प्रतिबिंबित करने के लिए अपना उत्तर संपादित करूंगा। –
मैं एक नोट जोड़ूंगा कि BigDecimal _division_ को +, -, * से थोड़ा अलग तरीके से इलाज करने की आवश्यकता है, क्योंकि डिफ़ॉल्ट रूप से यह एक अपवाद फेंक देगा यदि यह एक सटीक मान (1/3, उदा।) वापस नहीं कर सकता है। इसी तरह की स्थिति में मैंने उपयोग किया: BigDecimal.valueOf (ए) .डिवाइड (BigDecimal.valueOf (बी), 25, RoundingMode.HALF_UP)। डबलवैल्यू(), जहां 25 सटीक के अधिकतम अंक (डबल परिणाम से अधिक की आवश्यकता से अधिक)। –