2011-11-10 17 views
25

संभव डुप्लिकेट:
How to resolve a Java Rounding Double issueजावा में दो डबल मानों की तुलना कैसे करें?

जावा में दो दोहरे मूल्यों का एक सरल तुलना में कुछ समस्याएं पैदा करता है। आइए जावा में निम्नलिखित सरल कोड स्निपेट पर विचार करें।

package doublecomparision; 

final public class DoubleComparision 
{ 
    public static void main(String[] args) 
    { 
     double a = 1.000001; 
     double b = 0.000001; 

     System.out.println("\n"+((a-b)==1.0)); 
    } 
} 

ऊपर कोड true, अभिव्यक्ति ((a-b)==1.0) के मूल्यांकन वापस जाने के लिए प्रकट होता है, लेकिन ऐसा नहीं है। यह false देता है क्योंकि इस अभिव्यक्ति का मूल्यांकन 0.9999999999999999 है जो वास्तव में 1.0 होने की उम्मीद है जो 1.0 के बराबर नहीं है, इसलिए स्थिति बूलियन false पर मूल्यांकन करती है। ऐसी स्थिति को दूर करने का सबसे अच्छा और सुझाए गए तरीके क्या हैं?

+6

ऐसा इसलिए है क्योंकि युगल और फ्लोट प्रत्येक संख्यात्मक मूल्य व्यक्त नहीं कर सकते हैं। वे वास्तव में मूल्य का प्रतिनिधित्व करने के लिए अनुमान का उपयोग कर रहे हैं। – onit

उत्तर

53

पर एक नज़र डालें मूल रूप से आप सटीक तुलना नहीं करना चाहिए, तो आप कुछ इस तरह करना चाहिए:

double a = 1.000001; 
double b = 0.000001; 
double c = a-b; 
if (Math.abs(c-1.0) <= 0.000001) {...} 
+7

आप डबल की तुलना विधि को देखना चाहते हैं। इस लिंक को देखें: http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

लेकिन यदि आप Double.compare का उपयोग करते हैं, तो ध्यान दें कि (1) यदि d1 और d2 दोनों Double.NaN का प्रतिनिधित्व करते हैं, तो विधि सच है, भले ही Double.NaN == Double.NaN का मूल्य गलत है; और (2) यदि डी 1 +0.0 का प्रतिनिधित्व करता है जबकि डी 2 प्रतिनिधित्व करता है -0.0, या इसके विपरीत, विधि मान को गलत करती है, भले ही +0.0 == - 0.0 मान सही है। यह परिभाषा हैश टेबल को ठीक से संचालित करने की अनुमति देती है। – shiggity

8

दशमलव अंकगणितीय के लिए युगल का उपयोग करने के बजाय, कृपया java.math.bigDecimal का उपयोग करें। यह अपेक्षित परिणाम उत्पन्न करेगा।

संदर्भ के लिए इस stackoverflow question

+14

बिगडेसिमल कभी-कभी व्यवहार्य समाधान नहीं होता है। – mcfinnigan

1

आप Double.compare उपयोग कर सकते हैं; यह दो निर्दिष्ट डबल मानों की तुलना करता है।

संबंधित मुद्दे