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
.
|