Typ Float i niedokładność obliczeń

Odpowiedz Nowy wątek
2011-07-14 08:26
Rezus
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?

edytowany 1x, ostatnio: ŁF, 2016-12-13 18:26

Pozostało 580 znaków

2011-07-14 08:35
0

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

Pozostało 580 znaków

2011-07-14 08:37
pan kuba
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...

Pozostało 580 znaków

2011-07-14 08:52
Rezus
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ć..

Pozostało 580 znaków

2011-07-14 08:53
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)

edytowany 2x, ostatnio: bswierczynski, 2011-07-14 08:58

Pozostało 580 znaków

2011-07-14 09:10
Rezus
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

Pozostało 580 znaków

2011-07-14 09:43
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

Pozostało 580 znaków

2011-07-14 12:08
ŁF
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.


edytowany 1x, ostatnio: ŁF, 2011-07-14 12:12

Pozostało 580 znaków

2011-07-14 14:01
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ą.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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