Mój kod:
a = 2000.43;
b = 51;
document.write = parseFloat(a) + parseFloat(b);
Tymczasem wynik to:
2051.4300000000003
a nie
2051.43
Co jest nie tak?
Mój kod:
a = 2000.43;
b = 51;
document.write = parseFloat(a) + parseFloat(b);
Tymczasem wynik to:
2051.4300000000003
a nie
2051.43
Co jest nie tak?
Nic. Arytmetyka zmiennoprzecinkowa. Po zaokrągleniu powinno być ok.
Wszystko jest w porządku. To przez fakt, że binarnie nie da się zapisać pewnych ułamków w postaci skończonej. Np. 1/10 dziesiętnie = 0.1. Natomiast jakbyś próbował zapisać 1/10 binarnie, to będzie to rozwinięcie nieskończone - tak jak 1/3 dziesiętnie = 0.333...
Dzięki za odpowiedzi.
Co do zaokrąglenia - liczba ta będzie czasem sie zmieniać - czasem będzie to 123,34 zł a czasem 123,12345 zł , takze nie będę wiedział do jakiej liczby mam zaokrąglać..
Dodam, że wywołaniaparseFloat()
są tutaj zupełnie niepotrzebne. JS jest dynamicznie typowany. Taki sam efekt dałoby działanie a + b
. I koledzy wyżej mają rację: w zasadzie niczego z tym nie zrobisz. Jeśli chciałbyś obliczać np. sumy pieniędzy czy inne ważne rzeczy, nie powinieneś używać liczb zmiennoprzecinkowych. Powinieneś operować np. na groszach -- wtedy każda suma byłaby liczbą całkowitą, a takie liczby dodawane są poprawnie ;).
Oczywiście, na groszach operujesz wewnętrznie. Wyświetlając kwotę, przeliczyłbyś te grosze na złotówki i grosze i wyświetlił np. zlotowki + "," + grosze
, czy coś takiego. Przy czym var grosze = kwotaWGroszach % 100; var zlotowki = Math.floor(kwotaWGroszach / 100)
Nic z tym nie zrobię?
Czy w JS niepodobna wykonać operacji 100.22 + 32 = 132.22 ? To za trudne? Niemożliwe dla JS ? O_o
Rezus napisał(a)
Nic z tym nie zrobię?
Czy w JS niepodobna wykonać operacji 100.22 + 32 = 132.22 ? To za trudne? Niemożliwe dla JS ? O_o
Nie dla JS - dla procesorów :P
Rezus napisał(a)
Czy w JS niepodobna wykonać operacji 100.22 + 32 = 132.22 ? To za trudne? Niemożliwe dla JS ? O_o
rozwiń sobie binarnie 0.22 - 0.0011100001010001111010111000010100011110101110000101000111101011... dalej mi się nie chce. rozwinięcie jest nieskończone, stąd błąd zaokrąglenia.
@Rezus, nigdy przenigdy i pod żadnym pozorem nie wykonuj obliczeń związanych z pieniędzmi na typie zmiennoprzecinkowym. Do takich obliczeń służą albo specjalne klasy, które są tak zaprojektowane, że jedynym ograniczeniem co do dokładności jest pamięć albo obliczenia wykonuje się na liczbach całkowitych z założeniem, że ostatnie N cyfr to grosze. Użytkownik otrzymuje odpowiednio sformatowany wynik udający liczbę zmiennoprzecinkową.