我正在用 PHP 做一个简单的计算。
(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70)
- 从数据库中获取这些数据
PHP 给出8.8817841970013E-016
的答案不是零。
我已经尝试过类似 round、number_format 的函数,但仍然得到相同的结果
我正在用 PHP 做一个简单的计算。
(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70)
- 从数据库中获取这些数据
PHP 给出8.8817841970013E-016
的答案不是零。
我已经尝试过类似 round、number_format 的函数,但仍然得到相同的结果
表达式的十进制表示为“0.00000000000000088817841970013”。这是一个非常接近 0 的值,因为在计算机上使用浮点数进行计算时存在标准问题。
如果您想深入了解为什么会这样,可以在http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html找到一篇很棒的文章(但要注意,它很深 :) )
浮点运算可能会导致某些数字不准确。
如果你想做这样没有这些错误的算术(它是货币吗?),试着把它们作为整数,最后除以 100:
php > echo (270 + 230 + 2970 + -230 + -2970 + -270)/100;
0
如果它实际上是货币,则将它们存储DECIMAL
在数据库中并让数据库进行数学运算。
此外,round
应该可以正常工作:
php > echo 2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70;
6.2172489379009E-15
php > echo round(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70);
0
我还从 PHP 文档站点找到了一个包含更多信息的页面。
从问题中数字的外观来看,这可能是精确处理小数点后两位数的小数很重要的情况。如果是这样,请考虑以百分之几为单位工作。例如,美国货币可以被视为整数的美分,而不是小数点后两位的美元数量。
您仍然可以使用正常的数字解析,但是一旦您得到数字乘以 100 并四舍五入到最接近的整数。同样,输出除以 100 并格式化为两位小数。对整数值进行中间计算。
尝试这个
round(2.70 + 2.30 + 29.70 - 2.30 - 29.70 - 2.70)