Операция вычитания сложения PHP, неточный результат - PullRequest
0 голосов
/ 15 июня 2011

<?php echo 199.8 + 0.9 -200.7; //expect 0, result 2.8421709430404E-14 ? ?>

Протестировано на PHP версии 5.3.2-1 ubuntu4.7

Ответы [ 3 ]

7 голосов
/ 15 июня 2011

Дробная с плавающей запятой ограниченная область является неточной для некоторых значений (точно так же, как в десятичной записи вы не можете записать 1/3 в конечном пространстве).

2.8421709430404E-14 очень близко к 0.

Округлите его или выведите до определенного числа значащих цифр.

2 голосов
/ 15 июня 2011

Если вам нужны точные вычисления (т. Е. Для денежных транзакций), вам следует использовать BCD (двоично-десятичные десятичные дроби) или математические вычисления произвольной точности. PHP поддерживает это, используя BC Math .

0 голосов
/ 15 июня 2011

Вот точный пример с http://www.php.net/manual/en/ref.bc.php:

<?php

$a = 199.8;
$b = 0.9;
$c = 200.7;

// set precision
bcscale(1);

$ab = bcadd($a, $b);
echo bcsub($ab, $c); // result 0.0

?>

Протестировано с PHP 5.3.3-7 + squeeze1 на Debian Squeeze

...