2013-03-04 120 views
0

我正在做一个简单的PHP计算。PHP给8.8817841970013E-016而不是0

(2.70 + 2.30 + 29.70 + -2.30 + -29.70 + -2.70) - 从数据库

PHP是给8.8817841970013E-016的答案,而不是零了这些数字。

我已经试过像圆,number_format功能,但仍得到相同的结果

+0

以及它在一份报告中显示,没有手段PHP正好做计算? – 2013-03-04 07:44:00

+0

您可能想要了解浮点数。长话短说,有一些数字不能用二进制表示,就像你不能用十进制表示1/3一样。至于修正,number_format()可能会做得很好,除非计算很关键。在这种情况下,你最好避免浮点。 – GordonM 2013-03-04 07:44:13

+5

您尝试使用round或者number_format的结果是什么< – 2013-03-04 07:44:41

回答

0

试试这个

round(2.70 + 2.30 + 29.70 - 2.30 - 29.70 - 2.70) 
2

浮点运算可以创建一些数字inaccurracies。

如果你想要做算术像这样不具备这些错误(是货币?),尝试到底在做什么他们作为整数除以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 

我还发现a page with more info就可以了,从PHP文件的网站。

+0

总是,当数字不能表示为二进制数。 例如1/4可能没有任何错误。但是1/10是周期性的,并且在划分期间必须进行一些舍入。 – 2013-03-04 07:46:00

+0

这完全是不真实的。浮点算术在不同的规则下运行,而不是实数运算,但这并不意味着差异是错误的。 – 2013-03-04 07:46:49

+0

这不完全错误,我不明白这些快速downvotes。 – Kamil 2013-03-04 07:46:51

2

表达式的十进制表示形式为“0.00000000000000088817841970013”。这是一个非常接近于0的值,因为在计算机上使用浮点数进行计算时存在标准问题。

如果你想深入挖掘这是为什么没有在http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html提供一个伟大的文章(但要注意,其颇深:))

0

从有关数字的外观,这可能是精确处理小数点后两位数的小数是重要的。如果是这样,请考虑以百分之一为单位进行工作。例如,美国货币可以被视为整数美分,而不是小数点后两位。

您仍然可以使用正常的数字解析,但只要您将数字乘以100并四舍五入为最接近的整数。同样,输出除以100并格式化为小数点后两位。对整数值进行中间计算。

我推荐在那里读书What Every Computer Scientist Should Know About Floating-Point Arithmetic