Ruby 2.3*100 逆天了

baypm2014 · 2015年06月18日 · 最后由 zhang_soledad 回复于 2015年06月19日 · 2860 次阅读

问题: 为什么会出现这种情况: irb(main):007:0> 2.3*100 => 229.99999999999997

准确度从 2.3*43 就开始这么逆天了。

求解,谢谢!

浮点数有小误差,没问题的。

#1 楼 @chenge 只是想知道更深层的原因。

http://ruby-doc.org/stdlib-2.2.2/libdoc/bigdecimal/rdoc/BigDecimal.html

require 'bigdecimal'
print BigDecimal.new('2.3') ** BigDecimal.new('100')

http://justjavac.com/codepuzzle/2012/11/11/codepuzzle-float-who-stole-your-accuracy.html 这个问题计算机科学概论之类的书里应该有叙述,和浮点数在计算机内的表示有关

#4 楼 @cicholgricenchos thank you so much!!! 柳暗花明的感觉!

二进制无法表达十分之一就跟十进制无法表达三分之一一样

2.3 是无限不循环小树吧

跟语言无关,是实现的标准有关,只要是 ieee 754 的语言都有这样的问题的,当然我表示我是没有太整明白的. 可参考:http://stackoverflow.com/questions/56947/how-is-floating-point-stored-when-does-it-matter/57031#57031

这个计算机导论就应该会讲的吧 ieee754 的浮点数用 1. 0× 2-2(指数为 -2)这种形式去保存的 (数符位数 阶码位数 尾数位数 总位数) 这样会出现一些非规范化数 就是不能精确表达的

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