<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
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;-)