php substraction 145.48 - 80.26!= 65.22

时间:2014-01-20 10:55:03

标签: php

我遇到了PHP问题。 下面的这个确切的减法是错误计算的。

<?php

$test = 145.48 - 80.26;

if($test != 65.22)
    echo 'not good !';
else
    echo 'good';

?>

这回应“不好”!!!

为什么?

2 个答案:

答案 0 :(得分:4)

计算机不太擅长存储浮点(十进制)数字,因为在二进制中表示基数10十进制数很难。例如,如果您尝试将数字0.2存储为二进制,则计算机将按照模式0.00110011 ...存储一系列。根据浮点数的大小(即在内存中为其分配了多少位),精度会有所不同,但更重要的是,它永远不会精确地存储0.2。

有几种方法可以解决这个问题,一种方法是使用BC Math库并执行以下操作:

bcsub("145.48", "80.26");

但有时更好的解决方案是承认数字不准确并说明错误,即

if (abs($x - $y) < $e)

其中e是一个非常小的数字,例如10 ^( - 5)。这在使用物理计算等时是常见的做法,但当然在处理离散数字时,你不应该尝试这种做法,例如:货币。

答案 1 :(得分:1)

要进行精确浮点数运算,您可以使用bc_math

$test = bcsub("145.48", "80.26");
assert ($test == "65.22");