查看: 1866|回复: 5

[已经解决] 为什么p (3.0-8.0/3.0)*3.0 == 1.0 显示false?

[复制链接]
梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
回帖
25
发表于 2012-1-20 18:01:23 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 受pia专用ID 于 2012-1-21 20:00 编辑

p (3.0-8.0/3.0)*3.0 #=> 1
但为何p (3.0-8.0/3.0)*3.0 == 1.0就显示false?怎么解决?
p (3.0-8.0/3.0)*3.0 == 1 还是显示false啊
回复地面:
((3.0-8.0/3.0)*3.0).to_f==1
我这么写还是显示false
只能用这个方法了:Math.abs((3.0-8.0/3.0)*3.0-1)<=0.000001

点评

我知道= =打错了是.to_i==1但是这样做不好因为1.1.to_1也是1,比较好的还是普通做法  发表于 2012-1-21 20:27
是((3.0-8.0/3.0)*3.0).to_i = =。还有最好别这样用,Math.abs((3.0-8.0/3.0)*3.0-1)<=0.000001是比较正规的写法,因为浮点运算的误差,文艺写法和2B写法都是有问题的   发表于 2012-1-21 20:06
不好意思,打错了((3.0-8.0/3.0)*3.0).to_f==1.0 ,还有,如果回复的话直接在下面回复或者点评就好了,或者用@功能,你这样下我是看不到的  发表于 2012-1-21 20:05

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
回帖
2982

贵宾

发表于 2012-1-21 00:39:56 | 显示全部楼层
本帖最后由 feizhaodan 于 2012-1-21 00:40 编辑
  1. p (1.0).class
  2. p (1).class
复制代码
自己对比下。这就是人和计算机认识的区别。
回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2012-1-21 00:43:06 | 显示全部楼层
Math.abs((3.0-8.0/3.0)*3.0-1)<=0.000001
这是普通程序猿
((3.0-8.0/3.0)*3.0).to_f==1
这是文艺程序猿
((3.0-8.0/3.0)*3.0).to_i.to_s(16)=="0x01"
这是2B程序猿

点评

p ((3.0-8.0/3.0)*3.0).to_f==1.0 还是显示false  发表于 2012-1-21 20:15
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

酱油的

梦石
0
星屑
1840
在线时间
2161 小时
注册时间
2007-12-22
回帖
3216

贵宾

发表于 2012-1-21 01:29:50 | 显示全部楼层
p (3.0-8.0/3.0)*3.0 #=>1.0000000000000004
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复

使用道具 举报

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
回帖
56
发表于 2012-1-21 23:40:30 | 显示全部楼层
這是當代計算機浮點運算普遍的缺陷。目前的浮點數表示法是以二進制表示有效數位,當有限的十進制有效數位被轉換為二進制時,很多情況下就會導致二進制的表示成為無限數位。在有限的計算機位(32 位單精度,64 位雙精度)中表示浮點數時,它實際存儲的值只是近似於用戶原本想表示的值,是經過了計算機芯片「零舍一入」的。再經過一系列浮點運算後,這個誤差值就累積起來了,導致運算結果的誤差離預期的越來越遠。以前很多計算機軟件都是忽略了浮點運算的誤差而導致了嚴重的後果,導致火箭航程失控,股票系統崩潰等等。
回复

使用道具 举报

梦石
0
星屑
5615
在线时间
2571 小时
注册时间
2011-9-27
回帖
1059

极短23参与开拓者

发表于 2012-1-21 23:46:38 | 显示全部楼层
尽量先做乘法,最后做除法。尽量谋求整除的效果。

尤其是判定是否相等的时候,   a/b==c/d 这样的写法就比较糟糕,不如改成等价的 a*d==b*c ,避免除法,避免舍入误差。
从平淡走向更平淡。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部