2012-07-31 14 views
5

मुझे नीचे विधि का उपयोग कर गलत परिणाम मिल रहा है।100 * 2.55 मानों के मूल्यांकन के लिए गलत परिणाम प्राप्त करना

public double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return rtnValue.doubleValue(); 
    } 

पैरामीटर मान दर्ज कर रहे हैं: leftOperand = 100 और rightOperand = 2.55

मैं गलत जवाब हो रही है: 254,99999999999997

सही जवाब एक 255,0

+4

अनिवार्य -लिंक "हर कंप्यूटर वैज्ञानिक के बारे में फ्लोटिंग प्वाइंट अंकगणित क्या पता होना चाहिए": http://docs.sun.com/source/806-3568/ncg_goldberg.html – Jacob

+1

क्या * सटीक * मूल्य करना आपको विश्वास है कि "2.55" के आपके मूल्य में है? –

+0

@ जोनस्केट: यहां तक ​​कि यदि आप 2.55 और 100.0 दोनों के सटीक मूल्य को जानते हैं, तो भी जवाब गलत होगा ... –

उत्तर

4

यह है floating point precision problem के कारण। 64 बिट्स के भीतर प्रत्येक तर्कसंगत संख्या का प्रतिनिधित्व करना असंभव है। संख्या IEEE 754 format के भीतर संग्रहीत की जाती है।

यदि आप एक गेम बना रहे हैं, तो यह काफी अच्छा है, यहां तक ​​कि फ्लोट भी करेगा। लेकिन अगर आप कुछ वित्त कर रहे हैं, तो यह सही होना चाहिए। फिर आप java.math.BigDecimal का उपयोग कर सकते हैं। यह double से बहुत धीमा है लेकिन यह सही है। और इसमें बहुत अधिक स्मृति होती है, क्योंकि आपके पास स्मृति में सटीक मान है। BigDecimal का उपयोग करने के तरीके पर एक अच्छा ट्यूटोरियल है।

+0

धन्यवाद, आपकी जानकारी बहुत उपयोगी थी। – iMBMT

-1

Math.round() का उपयोग करना।

public static double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return Math.round(rtnValue.doubleValue()); 
    } 
संबंधित मुद्दे