以某种方式,PHP认为我的脚本中3.57 + 0.01等于3.5799999999999996。
我测试了大约10个类似的总和(例如10.51 + 0.01),然后PHP给了我正确的答案(在后一种情况下为10.52)。 因此,很奇怪的是,似乎只在使用这些特定的浮点数时才会犯此错误。
代码:(为便于阅读而简化)
$users = array();
$IDs = [1,2,3];
foreach($IDs as $ID)
{
$user = (object) array();
$user->ID = $ID;
$users[] = $user;
}
$initialAmount = 3.57;
$chosenIDs = [1,3];
foreach ($users as $key => $value)
{
$users[$key]->amount = $initialAmount;
if(in_array($key, $chosenIDs))
{
//the following returns 3.5799999999999996
$users[$key]->amount = $users[$key]->amount + 0.01;
//even if I do it like the following, it returns the wrong answer
$users[$key]->amount = 3.57 + 0.01; //according to PHP equals 3.5799999999999996
//the following actually gives the correct answer though
//$users[$key]->amount = ($users[$key]->amount * 100 + 1) / 100;
}
}
这是我的配置中的一些奇怪的错误吗?还是这是怎么回事?
答案 0 :(得分:0)
正如其他人所提到的,这是浮点数学而不是php的问题。
http://php.net/manual/en/language.types.float.php
在处理可能会出现浮点错误的数字时,可以通过使用BC Math扩展名来避免这种情况。它支持任意精度。