Próbowanie arytmetyki zmiennoprzecinkowej w Groovy. Nie masz pojęcia, dlaczego/jak/co robi groovy za kulisami, aby spowodować te różne typy zachowań?Dlaczego Groovy wykonuje w ten sposób arytmetykę zmiennoprzecinkową?
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
Myślałem, że ma to związek z BigDecimal, ale potem spróbowałem tego.
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
Co powoduje takie zachowanie?
możliwy duplikat [Czy matematyka zmiennoprzecinkowa jest zepsuta?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – tmyklebu
@tmyklebu nie jest to duplikat tego pytania; podczas gdy pierwsza połowa wskazywałaby, że, jak twierdzą stwierdzenia, są błędne, pytanie tutaj dotyczy (niejawnych) typów gromów dla "pływających" liczb. – cfrick
@cfrick: Rozumiem. Masz rację; dotyczy to rodzaju pozornego literału zmiennoprzecinkowego. Proszę wybaczyć mój swędzący palec spustowy; Widziałem "0,1" i "0,2" oraz "0,3" i powiedziałem "O Boże, nie znowu". – tmyklebu