jam00的博客

授人予鱼,不如授人予渔

PHP IEEE 754 精度错误

运行如下代码

$t = 39.800 * 100;
echo $t.'<br>';
echo intval($t);

结果:

3980
3979


文档解释

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

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等


这里使用是学函数来解决

$t = bcmul(39.800 , 100);
echo $t.'<br>';
echo intval($t);

结果

3980
3980

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jam00/article/details/51397294
个人分类: php
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭