konto usunięte

Temat: Błędne obliczenia

Czy jest ktoś w stanie wytłumaczyć mi dlaczego po wykonaniu np. takiego skryptu wynik nie jest całkowity?

<script type="text/javascript">
document.write(-45.71 + 35.47);
</script>

Skąd biorą się te nieścisłości w obliczeniach?
Marcin K.

Marcin K. Lead Software
Engineer, Tieto
Polska

Temat: Błędne obliczenia

nie bardzo rozumiem jakie masz nieścisłości, po pierwsze
-45.71+35.47=-10.24 a po wykonaniu skryptu masz
-10.240000000000002 , nie jest to liczbą całkowitą ponieważ javascript w tym przykładzie nie ma przyporządkowanego typu danych jakimi operujesz więc po sprawdzeniu ( w swojej kolejności : string,float,integer,boolean) że dodajesz 2 liczby rzeczywiste javascript ustawia wynik na rzeczywisty, ta "2" na samym końcu bierze się z zaokrągleń działań na liczbach rzeczywistych.
Jeśli chcesz wynik całkowity to spróbuj w ten sposób np.

<script type="text/javascript">
document.write(parseInt(-45.71 + 35.47));
</script>

PozdrawiamMarcin K. edytował(a) ten post dnia 01.10.07 o godzinie 10:06
Kuba Łopusiński

Kuba Łopusiński Ruby On Rails
developer

Temat: Błędne obliczenia

Takie wyniki obliczeń to znany problem - sprawdź google na hasło np. "javascript float precision".
Można to rozwiązać kombinacyjnie:

var eq = (-45.71 + 35.47).toString().split('.');
eq = eq[0]+'.'+eq[1].charAt(0)+eq[1].charAt(1);
alert(parseFloat(eq));

pozdr.Kuba Łopusiński edytował(a) ten post dnia 01.10.07 o godzinie 12:45

konto usunięte

Temat: Błędne obliczenia

Może źle sformułowałem swojego posta.
Chodziło mi o to, aby obliczenie dawało prawdziwy wynik, czyli -10.24
Z innego źródła dowiedziałem się już, że wynik -10.240000000000002 wyjaśnia standard zapisu liczb zmiennoprzecinkowych IEEE 754.

Póki co, aby uzyskać prawdziwy wynik zastosowałem Math.round:

<script type="text/javascript">
document.write(Math.round((-45.71+35.47)*100)/100);
</script>

tylko nie wiem czy w każdym przypadku (przy innych liczbach) ten sposób będzie niezawodny, tzn czy nie będzie przekłamań.
Marcin K.

Marcin K. Lead Software
Engineer, Tieto
Polska

Temat: Błędne obliczenia

Dawid L.:

tylko nie wiem czy w każdym przypadku (przy innych liczbach) ten sposób będzie niezawodny, tzn czy nie będzie przekłamań.

wydaje mi się, że podejście przesunięcia miejsca dziesiętnego da dobry wynik przy takich obliczeniach.

konto usunięte

Temat: Błędne obliczenia

Przy float-ach trzeba jeszcze uważać na porównania.
Tzn jeśli liczby nie zakrąglone, chociaż wydaje się że powinny być takie same, czasami nimi nie są.

Dlatego jeśli porównujesz dwie liczby zmienno przecinkowe, to trzeba je albo zaokrąglić do całkowitych (np. *100), albo używać czegoś takiego:

zamiast:
if (a<>b) ...
trzeba robić coś takiego:
if (Math.abs(a-b) < emin) ...
tutaj emin = 0.01

Wynika to z tego, że po obliczeniach może się okazać że:
a = 127.00000000002
b = 126.99999999999



Wyślij zaproszenie do