ree-1.8.7-2010.02 :003 > (10015.8*100.0).to_i
=> 1001579
ree-1.8.7-2010.02 :004 > 10015.8*100.0
=> 1001580.0
ree-1.8.7-2010.02 :005 > 1001580.0.to_i
=> 1001580
ruby 1.8.7 产生相同的结果。 有谁知道如何根除这种异端? =)
最佳答案
其实,这一切都是有道理的。
因为对于各种 0.8 不能用 1/2 ** x
的任何系列精确表示em>x
,肯定是近似表示的,刚好这个比10015.8略小。
所以,当你只是打印它时,它是合理的四舍五入。
当您将其转换为整数而不添加 0.5, 它会将 .79999999... 截断为.7
当您输入 10001580.0, 好吧,它在所有格式中都有一个精确表示,包括 float 和 double。所以你看不到一个值的截断比下一个积分步骤稍微小一点。
float 并不是不准确,它只是对可以表示的内容有限制。是的,FP 非常准确,但不一定代表我们可以使用基数 10 轻松输入的每个数字。(更新/澄清:嗯,具有讽刺意味的是,它可以精确表示每一个整数,因为每一个整数都有一个2 ** x
的组成,但是“每一个分数”就是另外一回事了。某些小数可以使用 1/2**x
系列精确组成。)
事实上,JavaScript 实现对所有数值都使用浮点存储和算术。这是因为 FP 硬件为整数产生了精确的结果,所以这让 JS 人员在(当时)几乎完全是 32 位机器上使用现有硬件进行 52 位数学运算。
关于ruby:在 ruby 中从 float 转换为整数会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5255629/