关于PHP浮点数精度问题

PHP manual中说:

以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。

// example1
$float = (0.1 + 0.7) * 10;
echo (integer) $float;            // 7
echo floor($float);               // 7

// example2
echo (integer) (1.5+1.5);         // 3
echo floor(1.5+1.5);              // 3

// example3
echo (integer) (0.5*10);          // 5
echo floor(0.5*10);               // 5

为什么在例子2和例子3中,浮点数的运算能够保全精度呢?

阅读 8.3k
2 个回答

又是献上我博客的时候了:

0.1 + 0.7 的结果是 0.7999999999999999

0.5 1.5 可以用浮点数精确的表示。

0.1 的二进制:

符号位 0 
指数 01111011 (-4)
位数 1.10011001100110011001101 (1.60000002384185791015625)

将这个数在转回十进制:0.10000000149011612

0.7 的二进制:

符号位 0 
指数 01111110  (-1)
位数 1.01100110011001100110011 (1.39999997615814208984375)

将这个数在转回十进制:0.699999988079071

先去百度一下浮点数用二进制是怎么表示的, 就明白为什么有些浮点数用二进制表示的话为什么总是小于实际的浮点数,有些浮点数的二进制是正确。比如:0.7 实际二进制表示的是0.69999999999999996, 而0.5的二进制还是二进制,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏