新手问题 Float 类型的数字相加,出现 bug?

helloqidi · 2012年09月20日 · 最后由 helloqidi 回复于 2012年09月21日 · 7082 次阅读
0.01+0.01
=> 0.02 

200.01+0.01
=> 200.01999999999998

Ruby 版本:1.9.3p0

是你不懂浮点数吧

浮点数是不精确的,请使用 BigDecimal

浮点类型本来就不准

查了点资料。浮点数其实是真实数的近似,所以产生了限制。以下几点要注意:

1,浮点数是有限的。 浮点数只能拥有有限信息。

2,浮点数有误差。 任意的实数,只要是用有效数字和指数的结合来近似表示的,有效数字的不足部分被简单地忽略。多次运算后,与实际值的误差就会累计起来,计算结果与理论值偏差很大是常有的事。

3,对于浮点小数,结合法不成立。 结合法是指加法和乘法中,不管顺序怎样,计算结果都相同的法则。但在浮点小数中不成立。

浮点数运算的陷阱可以归结为 2 个原因:一是能够表示的精度有限,而是以二进制表示。这些换来的代价是速度上的优势,Ruby 中,为了提高精度,提供了 BigDecimal 类,有 3 个特征: 1,与 Bignum 一样,有效数字自动扩展; 2,以十进制计算; 3,以 C 语言记述,比内嵌的浮点数类 Float 要慢。

#5 楼 @helloqidi

还有一条:别想楼主那样,把一个很大的数字和很小的数字一起相加,那样会很惨。(来自于 松本行宏的程序世界 )

需要 登录 后方可回复, 如果你还没有账号请 注册新账号