PHP рассчитать поплавок - PullRequest
       11

PHP рассчитать поплавок

3 голосов
/ 18 апреля 2010

У меня здесь странный математический расчет. Я надеюсь, что кто-то объяснит.

$a = 1.85/100;
$b = 1.5/100;
$c = 1.1/100;
$d = 0.4/100;
$e = 0.4/100;
$f = 0.4/100;
$g = 0.4/100;

$h = $a + $b + $c + $d + $e + $f + $g;

echo $h*100 ."<br>";
$i = $h-$a;
$i = $i-$b;
$i = $i-$c;
$i = $i-$d;
$i = $i-$e;
$i = $i-$f;
$i = $i-$g;

echo $i;

Последнее значение $i должно быть 0, но оно возвращает 6.93889390391E-18.

Ответы [ 3 ]

6 голосов
/ 18 апреля 2010

Вы должны прочитать эту статью:

Что должен знать каждый компьютерщик об арифметике с плавающей точкой

Арифметика с плавающей точкой не является точной. Вам следует ожидать небольших ошибок. Ответ правильный с точностью до небольшой ошибки округления. Если вам нужно проверить, равно ли число с плавающей запятой нулю, лучше не проверять, что оно точно равно нулю, а вместо этого проверять, достаточно ли близко к нулю.

Если вам действительно нужна точная арифметика, не используйте типы с плавающей точкой. В вашем примере вы можете умножить все свои числа на 100 и использовать целочисленную арифметику, чтобы получить точный ответ.

2 голосов
/ 18 апреля 2010

В этом нет ничего плохого, есть просто приближение округления.

В этом случае вы должны умножить все свои значения на 1000 и сделать деление в конце расчета или, что лучше, прибегнуть к расширению точного вычисления

2 голосов
/ 18 апреля 2010

Любая идея, чтобы исправить мое уравнение, чтобы показать конечный результат 0,00?

Да, round($i, 2)

«Расхождения» обычно настолько малы, что округление до 2 десятичных знаков почти всегда решает проблему.

...