这个问题很有意思

kyzy_yy_pm 2011-11-02 11:22:14
echo (int) ((0.1 + 0.7) * 10);
// 结果很蛋疼:7
// 这是为什么呢?
...全文
220 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起混吧 2011-11-02
  • 打赏
  • 举报
回复
楼主是在手册上看到的例子吧。

引用手册上的一段:

显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9。

这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
ci1699 2011-11-02
  • 打赏
  • 举报
回复
占个位置先。深学地思考中...
黄袍披身 2011-11-02
  • 打赏
  • 举报
回复
好大个蛋。。。

不知道,等怪蜀黍来上课
kyzy_yy_pm 2011-11-02
  • 打赏
  • 举报
回复
多谢!!
amani11 2011-11-02
  • 打赏
  • 举报
回复
如果还有C语言印象,应该能回忆起

用逼近法解方程,,定义一个小量,例如1e-6

当计算F(x)的绝对值<1e-6,就认为找到了解

实际上echo (int) ((0.1 + 0.7) * 10000);应该会输出7999

而echo (int) ((0.1 + 0.9) * 10);可能发现结果是预期中的。。。解决方案#5,一般用bc系列或如#3 gmp
xuzuning 2011-11-02
  • 打赏
  • 举报
回复
首先令
$n = (0.1 + 0.7) * 10;
echo $n; //得到 8 这不存在任何问题

其次
echo (int)$n; //得到 7
为什么呢?

printf('%.16f', $n); //得到 7.9999999999999991

由此可知
1、强制类型转换并不十分可靠,比如 int 就只是简单的截尾
2、浮点数始终都有一个精度问题。凡是懂计算机的人都知道的


binarie 2011-11-02
  • 打赏
  • 举报
回复
虚心听乔丹大帝讲解
「已注销」 2011-11-02
  • 打赏
  • 举报
回复
虚心听乔丹大帝讲解
foolbirdflyfirst 2011-11-02
  • 打赏
  • 举报
回复
#3 +1
手册里有解释,浮点运算是个难点,不光光是php有类似问题。
php碰到这种运算,果断上bc_math
echo bcmul(bcadd((string)0.1,(string)0.7,1),'10');

李一升 2011-11-02
  • 打赏
  • 举报
回复
我的直接就报错了

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧