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

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 

ruby1.8.7产生相同的。 有谁知道如何根除这种异端邪说? =)

实际上,所有这些都是有道理的。

因为对于各种x0.8不能用任何1 / 2 ** x系列精确表示,所以它必须近似表示,并且它恰好小于10015.8。

所以,当你打印它时,它是合理的。

当你将它转换为整数而不添加0.5时,它会截断.79999999 ….7

当你输入10001580.0时 ,它具有所有格式的精确表示,包括float和double。 因此,您没有看到值的截断比下一个积分步骤略微小一些。

浮点不是不准确的,只是对可以表示的内容有限制。 是的,FP 非常准确,但不一定代表我们可以使用基数10轻松输入的每个数字 (更新/澄清:讽刺的是,它可以精确地表示每个整数,因为每个整数都有2 ** x组合,但是每一部分“都是另一个故事。只有使用1/2**x系列才能精确地组成某些小数部分。”

实际上,JavaScript实现对所有数值使用浮点存储和算术。 这是因为FP硬件为整数产生了精确的结果,所以这使得JS人员使用现有硬件(当时)几乎完全32位的机器进行52位数学计算。

由于浮点计算中的截断错误,10015.8 * 100.0实际上计算为1001579.999999 …因此,如果您只是应用to_i,它将截断小数部分并返回1001579

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

 >> sprintf("%.16f", 10015.8*100.0) => "1001579.9999999999000000" 

并且Float#to_i截断为1001579。