Jest oczywiste, że nawet proste ułamki dziesiętne, takie jak
0.1 lub 0.7, nie mogą zostać
skonwertowane na ich dwójkowe odpowiedniki bez niewielkiej straty
dokładności. Może to powodować pewne problemy: na przykład wyrażenie
floor((0.1+0.7)*10) zwykle ma wartość
7, zamiast oczekiwanej 8, gdyż
wewnętrzna reprezentacja tego wartości to liczba
7.9999999999....
Powiązane jest to z faktem, że dla pewnych ułamków zwykłych nie istnieje
skończone rozwinięcie dziesiętne. Na przykład 1/3 w
reprezentacji dziesiętnej ma wartość 0.3333333. . ..
Dlatego nigdy nie należy wierzyć liczbom zmiennoprzecinkowym do ostatniej
cyfry i nigdy nie należy wykonywać operacji porównania na stwierdzenie
równości. Do operacji na liczbach zmiennoprzecinkowych o naprawdę dużej
precyzji należy użyć biblioteki BCMath lub funkcji
gmp.
|