Глюк с элементарным вычислением....

REMO

Guest
Глюк с элементарным вычислением....

PHP:
$a = 93.05;
$b = 92.775;
echo $a-$b;
Почему результатом вывода след кода будет: 0.27499999999999, а не 0,275, как должно быть...

Как это исправить, спасибо.
:(
 

Crazy

Developer
Исправить просто: найди компьютер, который считает в десятичной системе, а не в двоичной. Искать, правда, придется долго.

Зато у тебя будет время прочитать что-нибудь про то, как именно выполняются вычисления с плавающей точкой на распространенных свовременных компьютерах.
 

REMO

Guest
2Crazy

Т.е. ты хочешь сказать, что это неисправить....

Как они выполняются я действительно не в курсе....

Так какой же выход?? Как получить правильное число...
 

REMO

Guest
2alpes

Не ну раунд это я и сам понял...
Но я просто никогда не сталкивался с таким, и поэтому думал, что это глюк или еще что то, а не как говрит Крэйзи, что это норма....

Нда... а может кто то кинет ссылку, где можно про это почитать...

TNX
 

REMO

Guest
У меня версия 4.2.3, значит это в этом дело (в глюке), а не в том, что так и должно быть...

Внесите кто-нить ясность, это глюк ПХП или так и должно быть, а просто в 4.3.1 ипсравили так, чтоб народ не заморачивался и сразу выдает прав число..
 

Crazy

Developer
Для практически любой версии:

PHP:
<?php

ini_set('precision',3);

$a = 93.05; 
$b = 92.775; 
echo $a-$b;

?>
Еще раз: результат выдается нормальный. :) В том числе -- в версии 4.3.1. А у гражданина Крома, вероятнее всего, сбилось значение precision... :)

P.S. Кстати, Деда Мороза тоже не бывает.
 

vladax

Новичок
О Великий и Могучий, Милостивый и Милосердный МАН, не дай умереть в неведении!

"Точность "с плавающей точкой"
Весьма часто простые дроби вроде 0.1 или 0.7 не могут конвертироваться в их внутренние двоичные представления без потери точности. Это может привести к парадоксальным результатам: например, floor((0.1+0.7)*10) обычно возвращает 7 вместо ожидаемого 8 как результат внутреннего представления приблизительного числа 7.9999999999....

Причиной является то, что невозможно точно выразить некоторые дроби в десятичной нотации конечным количеством цифр. Например, 1/3 в десятичной форме имеет вид 0.3333333...

Итак, никогда не полагайтесь на точность результата с плавающей точкой до последней цифры и никогда не проверяйте равенство чисел с плавающей точкой. Если вам нужна действительно высокая точность вычислений, вы должны использовать math-функции произвольной точности или gmp."
 

Кром

Новичок
>А у гражданина Крома, вероятнее всего, сбилось значение precision...

Действительно сбилось, на 12, не знаю даже почему... :)
 

camka

не самка
По моему дак пресижн=12 это для того и задумано, чтобы подобные чудеса народ не смущали. Примерно так
PHP:
<?php
ini_set('precision',19);
$c = 0.1;
echo $c;
?>
 
Сверху