JavaScript - błąd w liczbach zmiennoprzecinkowych (0.3+0.6=)

<script>alert(0.3+0.6);console.log(0.3+0.6);[/code]

Może ktoś wyjaśnić dlaczego jest 0.8(9) a nie 0.9? 

To są przecież jawne liczby z 1 miejscem po przecinku, a nie żadne wyniki działań czy stringi zamiast float.



W innych językach programowania jest ok.

Np.


[code=php]?php

zapomniałeś już o tym temacie? blad-porownywaniem-okreslonych-liczb-t538534.html

Tam dotyczy wszystkich języków i konwersji string do float.

A tu są zwykłe liczby zmiennoprzecinkowe, problem dotyczy tylko JS.

“zwykłe liczby zmiennoprzecinkowe”, czyli co?

…a w innych językach są jakieś “niezwykłe” ?

I nie, problem nie dotyczy “tylko JS”.

Zacznij jeszcze raz od początku:

No tak, liczba 0.9 wygląda już dziwacznie w zapisie 16-tkowym, czyli w zapisie binarnym jest jakby nieskończona. A wspominając o zwykłych liczbach zmiennoprzecinkowych chodziło mi o liczby które w matematyce są skończone.

Jak widać PHP z tym radzi (pewnie programowo), a JS na tych 2 konkretnych liczbach się wykłada.

MySQL (BTW. Maria DB? zdawało mi się że oraclowego MySQL instalowałem) znowu zależnie od sposobu zapisu.

MariaDB [mysql]> select 0.6+0.3

    -> ;

+---------+

| 0.6+0.3 |

+---------+

| 0.9 |

+---------+

1 row in set (0.02 sec)


MariaDB [mysql]> select '0.6'+'0.3';

+--------------------+

| '0.6'+'0.3' |

+--------------------+

| 0.8999999999999999 |

+--------------------+

1 row in set (0.00 sec)

Prawdopodobnie MySQL w 1. zapisie i np. PHP musi robić obliczenia na liczbach stałoprzecinkowych. Natomiast w JS nie znam (albo nie pamiętam) w jaki sposób lub przy pomocy jakiej małej biblioteki można wymusić matematycznie poprawnie obliczanie liczb zmiennoprzecinkowych. W ostateczności sam będę musiał coś naskrobać, aby jedna duperelka mi działała.

Tak ci się tylko wydaje. Nie zawsze to co widzisz, jest tym co myślisz że widzisz ;p

Nawet w PHPie można się przejechać na zmiennoprzecinkowych nie znając ich natury, ani samego PHPa.

Ot, niby sobie dodałeś i niby wynik widzisz poprawny …ale czy aby na pewno?

$num = (0.1 + 0.7) * 10;

echo (int) $num;

Zgadnij teraz, jaki będzie wynik? :roll:

Co do JS, to od tego masz zaokrąglanie, od tego jest toPrecision() czy toFixed() czy różnorakie biblioteki w stylu bigdecimal, bignum itd. itp.

Podczas nieaktywności forum podziałałem na liczbach całkowitych.

Coś ten rysunek (http://media.wiley.com/Lux/65/181665.image1.jpg) mi przypomniał ze studiów.

W sumie i dziś trudno w to uwierzyć, że nikt nie wymyślił sprzętowego sposobu na liczby binarnie nieskończone, o ile można je tak nazwać. Ewentualnie nikt nie ujednolicił tego w jeżykach programowania. Tak to mamy sytuację, gdzie albo rzutujemy zmienną i widzimy co komputer ma na myśli, albo używamy obejść i widzimy czego oczekujemy;-)