ruby:在 ruby​​ 中从 float 转换为整数会产生奇怪的结果

标签 ruby floating-accuracy

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/

相关文章:

c++ - 浮点相等和公差

ruby-on-rails - 如何将变量添加到现有模型 ruby​​ on rails

ruby - 获取包含在两个特定单词之间的子字符串

ruby - 来自方法的真实过程

math - float 学有问题吗?

math - 为什么浮点运算在添加小数时不能给出准确的结果?

css - 如何将变量从一个 lesscss 样式表传递到包含的样式表?

ruby - 如何为模型获取新的 mongoid 索引

php - 来自 microtime 的圆形 float

c# - 为什么是 float.Epsilon 而不是零?