php中3个小数的计算,如134.7-52.5 - 82.2,为啥结果不是0而是一个奇怪的科学计数法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php中3个小数的计算,如134.7-52.5 - 82.2,为啥结果不是0而是一个奇怪的科学计数法?相关的知识,希望对你有一定的参考价值。

楼上的回答很详细了,而且,这不仅仅是php的问题,你在js里console.log(134.7-52.5 - 82.2)

也得不到0的,

如果真要用php进行float计算的话,推荐BCMATCH,如:

echo bcsub(bcsub(134.7,52.5,1),82.2,1);

 

参考技术A 浮点数的精度

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
参见» 浮点数指南网页的简单解释。

http://www.php.net/manual/zh/language.types.float.php追问

谢谢,那该如何解决这个问题呢?而且这也太奇怪了吧,其它的编程语言输出这个表达式的结果肯定都是0,php怎么会这么麻烦!

PHP 中计算(int)(0.58*100)等于57的问题

       在牵扯到PHP数值运算中我们有可能会遇到这样的情况,(int)(0.58*100) = 57,预期值为58,0.57经过这样的计算也是这样的。这是什么情况呢?这个问题是因为,计算机计算10进制是要把十进制转化成二进制计算完后再转化回来显示,而0.57,0.58在转化成10进制时是个无穷二进制小数也,就是不能转化成一个有穷二级制小数。当强制整形(int) 或者intval()的时候会截断小数位导致数值失真。

       这看起来是个小问题,但是失之毫厘谬以千里,特别是在计算钱的时候。

如果遇到这种问题咋办?首先我认为关于价格的计算设计数据库的时候多保留几位小数比如3位或者4位,第二最小单位可以设置为分。其次就是用round()函数四舍五入。

以上是关于php中3个小数的计算,如134.7-52.5 - 82.2,为啥结果不是0而是一个奇怪的科学计数法?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何保留一位小数点

php数字转化中 多位小数怎样处理

如何用sql语句将计算结果保留两位小数

7 位小数计算的 UTC 时间

PHP 中计算(int)(0.58*100)等于57的问题

linux 除法保留小数