2015-01-07 10 views
5

ग्रोवी में अस्थायी बिंदु अंकगणित करने का प्रयास कर रहा है। इन विभिन्न प्रकार के व्यवहारों के कारण दृश्यों के पीछे क्यों/कैसे/क्या ग्रोवी कर रहा है, इस बारे में कोई जानकारी नहीं है?ग्रोवी इस तरह से अस्थायी बिंदु अंकगणित क्यों करता है?

double point2 = 0.2 
double point1 = 0.1 
double point3 = 0.3 

assert point2 + point1 == point3 // false, as expected 
    |  | |  | | 
    0.2 | 0.1 | 0.3 
      |  false 
      0.30000000000000004  

float point2 = 0.2 
float point1 = 0.1 
float point3 = 0.3 

assert point2 + point1 == point3 // false, as expected 
    |  | |  | | 
    0.2 | 0.1 | 0.3 
      |  false 
      0.30000000447034836 

def point2 = 0.2 
def point1 = 0.1 
def point3 = 0.3 

assert point2 + point1 == point3 // this returns true 
assert 0.2 + 0.1 == 0.3 // this returns true 

मैंने सोचा कि इसे बिगडेसिमल के साथ करना है लेकिन फिर मैंने कोशिश की।

BigDecimal point2 = 0.2 
BigDecimal point1 = 0.1 
BigDecimal point3 = 0.3 

float point4 = 0.4 

assert point1 + point3 == point4 
    |  | |  | | 
    0.1 | 0.3 | 0.4 
      0.4  false 

इस व्यवहार का कारण क्या है?

+0

संभावित डुप्लिकेट [क्या फ़्लोटिंग पॉइंट गणित टूटा हुआ है?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – tmyklebu

+2

@tmyklebu नहीं यह इस प्रश्न का डुप्लिकेट नहीं है; जबकि पहली छमाही यह इंगित करेगी कि, जैसा कि आवेषणों को गलत किया गया है, यहां प्रश्न "अंतर्निहित) प्रकार के बारे में है" फ्लोटी "संख्याओं के लिए ग्रोवी के प्रकार। – cfrick

+0

@cfrick: मैं देखता हूं। आप सही हे; यह एक स्पष्ट फ्लोटिंग-पॉइंट शाब्दिक प्रकार के प्रकार के बारे में है। कृपया मेरी खुजली ट्रिगर उंगली माफ कर दो; मैंने '0.1' और' 0.2' और '0.3' देखा और कहा" हे भगवान, फिर से नहीं। " – tmyklebu

उत्तर

5

अपने def: एस BigDecimals

groovy:000> p1 = 0.1 
===> 0.1 
groovy:000> p1.getClass() 
===> class java.math.BigDecimal 

और equals BigDecimal और देशी नाव के बीच comparsion के लिए विफल रहता है देखते हैं/डबल

groovy:000> p1.equals(0.1f) 
===> false 
groovy:000> p1.equals(0.1) 
===> true 
groovy:000> p1==0.1f 
===> false 
groovy:000> p1==0.1 
===> true 

सुनिश्चित नहीं हैं कि अभी तक, क्यों [डीडी] के लिए काम करता है == ouble ।

groovy:000> p1.equals(0.1d) 
===> false 
groovy:000> p1==0.1d 
===> true 

मेरा अनुमान होगा कि यह DefaultTypeTransformation.compareToWithEqualityCheck में फंस गया है। चूंकि दोनों पक्ष संख्याएं हैं: एस।

+0

मैंने यह पाया कि प्रश्न में और अधिक जोड़ा गया है। – kschmit90

+0

ठीक है, लेकिन BigDecimal और देशी फ्लोट/डबल के बीच तुलना के लिए बराबर विफल क्यों होता है? तो मैं एक डबल से एक BigDecimal की तुलना कर सकते हैं लेकिन एक फ्लोट नहीं? – kschmit90

+3

वास्तव में मुझे लगता है कि आपको एक बग मिला है। मेरी धारणा यह होगी कि BigDecimal गलत रूप से तुलना के लिए डबल में परिवर्तित हो गया है। मैंने इसे ट्रैक करने के लिए http://jira.codehaus.org/browse/GROOVY-7238 खोला – blackdrag

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