一尘不染

PHP-浮点数精度

php

$a = ‘35’;
$b = ‘-34.99’;
echo ($a + $b);

结果为0.009999999999998

这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。

为什么PHP不返回预期的0.01?


阅读 359

收藏
2020-05-26

共1个答案

一尘不染

因为浮点运算!=实数运算。对于一些浮子ab,由不精确性引起的差异的说明是(a+b)-b != a。这适用于使用浮点数的任何语言。

由于浮点数是具有有限精度的二进制数,因此存在有限数量的可表示数,这会导致精度问题]和类似的意外情况。这是另一篇有趣的读物:每位计算机科学家都应了解的浮点运算法则]。


回到您的问题,基本上没有办法用二进制准确地表示34.99或0.01(就像十进制一样,1/3 = 0.3333
…),因此使用了近似值。要解决此问题,您可以:

  1. 使用round($result, 2)的结果是四舍五入到小数点后2位。

  2. 使用整数。如果那是货币,以美元为单位,则将35.00美元存储为3500,将34.99美元存储为3499,然后将结果除以100。

遗憾的是,PHP没有其他语言那样具有十进制数据类型。

2020-05-26