为什么PHP认为3.57 + 0.01等于3.5799999999999996?

时间:2018-07-05 13:42:31

标签: php

以某种方式,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;
  }
}

这是我的配置中的一些奇怪的错误吗?还是这是怎么回事?

1 个答案:

答案 0 :(得分:0)

正如其他人所提到的,这是浮点数学而不是php的问题。

http://php.net/manual/en/language.types.float.php

在处理可能会出现浮点错误的数字时,可以通过使用BC Math扩展名来避免这种情况。它支持任意精度。

http://php.net/manual/en/ref.bc.php