我遇到了PHP问题。 下面的这个确切的减法是错误计算的。
<?php
$test = 145.48 - 80.26;
if($test != 65.22)
echo 'not good !';
else
echo 'good';
?>
这回应“不好”!!!
为什么?
答案 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");