PHP изключения

dakata__92

Super Moderator
Интересувам се от проблеми, като този:
PHP:
echo (int) ((0.1 + 0.7) * 10);

Има ли някъде описани такъв тип "странни" факти за PHP?
 
dakata__92 каза:
Интересувам се от проблеми, като този:
PHP:
echo (int) ((0.1 + 0.7) * 10);

Има ли някъде описани такъв тип "странни" факти за PHP?
Това не е странен факт за PHP, а и в много други езици за програмиране. Например в JavaScript работи по същия начин:

[js]parseInt((0.1 + 0.7) * 10)[/js]

И в питон също: https://www.ideone.com/YY7EX4

print int((0.1 + 0.7) * 10)

И в кои ли още не.
 
Именно. Има ли някъде информация на Български език по темата? Търся си литература по възможност на майчиният ни език. :)
 
http://floating-point-gui.de/
http://floating-point-gui.de/basic/

https://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples

http://www.tyanev.com/home.php?s=271&lang=bg&mid=18&mod=1&b=12

Надявам се че те насочих поне малко :)

Код:
Prelude> 0.1+0.2
0.30000000000000004
 
Не съм сигурен дали ще ти помогне това за обеснение все пак но ето няколко малки знания :)

Ако низът започва с "0x", радиусът е 16 (шестнадесетичен)
Ако низът започва с "0", радиусът е 8 (осмичен).
Тази функция е отхвърлена
Ако низът започва с друга стойност, радиусът е 10 (десетично)


Типично е, че прости десетични фракции като 0,1 или 0,7 не могат да бъдат преобразувани в техните вътрешни двоични контрагенти без малка загуба на точност. :?:

Ето малко повече :)

http://www.zendexam.com/question/19/consider-the-following-php-scriptwhat-will-be-the-output-of-the-php-script/
 
dakata__92 каза:
Интересувам се от проблеми, като този:
PHP:
echo (int) ((0.1 + 0.7) * 10);

Има ли някъде описани такъв тип "странни" факти за PHP?

А защо въобще го кастваш? С (int) каст правиш все едно floor(..). Вместо това, каствай до (real), за да получиш реалната стойност. Или въобще не го каствай.
Цялата работа идва от това, че числата с плаваща запетая не се преобразуват напълно точно в двоично число. Де факто от 0.1+0.7 получаваш 0.7(9) (9 в период) и като го кастнеш му взимаш само основата.
 

Горе