关闭

PHP IEEE 754 精度错误

704人阅读 评论(0) 收藏 举报
分类:

运行如下代码

$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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:29697次
    • 积分:406
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:1篇
    • 译文:0篇
    • 评论:22条
    文章分类
    最新评论