Provare aritmetica in virgola mobile in Groovy. Non hai idea del perché/come/che groovy sta facendo dietro le quinte per provocare questi diversi tipi di comportamenti?Perché Groovy esegue l'aritmetica in virgola mobile in questo modo?
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
Ho pensato che avesse a che fare con BigDecimal ma poi ho provato questo.
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
Che cosa sta causando questo comportamento?
possibile duplicato di [La matematica in virgola mobile è rotta?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – tmyklebu
@tmyklebu no questo non è un duplicato di questa domanda; mentre la prima metà indicherebbe che, siccome gli asseriti sono formulati in modo errato, la domanda qui riguarda i cast (impliciti) di tipo groovy per numeri "floaty". – cfrick
@cfrick: capisco. Hai ragione; si tratta del tipo di un letterale a virgola mobile apparente. Per favore perdona il mio dito prurito; Ho visto '0.1' e' 0.2' e '0.3' e ho detto" Oh Dio, non di nuovo ". – tmyklebu