Typ Float i niedokładność obliczeń

0

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?

0

Nic. Arytmetyka zmiennoprzecinkowa. Po zaokrągleniu powinno być ok.

0

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...

0

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ć..

1

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)

0

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

0
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

0
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.

0

@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ą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1