Ruby 浮动不精确的最佳解决方案

Ruby 浮动不精确的最佳解决方案,ruby,floating-point,precision,Ruby,Floating Point,Precision,我面临着浮动不精确: 3.84 + 2.53 #=> 6.369999999999999 考虑到数字可以是nil,我可以想到上述问题的以下解决方案 (num1.to_f + num2.to_f).round(2) 其中使用来处理nil。或者 num1.to_d + num2.to_d 或 其中使用to_s处理nil (num1.to_f + num2.to_f).round(2) 在所有这些问题中,哪一个是解决浮动不精确问题的最佳方案?有更好的解决方案吗?只要你留在Rational

我面临着浮动不精确:

3.84 + 2.53 #=> 6.369999999999999
考虑到数字可以是
nil
,我可以想到上述问题的以下解决方案

(num1.to_f + num2.to_f).round(2)
其中使用
来处理
nil
。或者

num1.to_d + num2.to_d

其中使用
to_s
处理
nil

(num1.to_f + num2.to_f).round(2)

在所有这些问题中,哪一个是解决浮动不精确问题的最佳方案?有更好的解决方案吗?

只要你留在Rational land,有理数和整数一样精确:

3.84r + 2.53r
# => (637/100)
显然,不合理的操作会把你踢出去:

Math.sqrt(4r)
# => 2.0
编辑:如果您已经从浮动开始。。。但没那么漂亮:

3.84.to_r
# => (1080863910568919/281474976710656)
因此,使用字符串表示可能更好(编辑:或者更好,使用nice
#rationalize
方法):


有理数和整数一样精确,只要你呆在有理数的土地上:

3.84r + 2.53r
# => (637/100)
显然,不合理的操作会把你踢出去:

Math.sqrt(4r)
# => 2.0
编辑:如果您已经从浮动开始。。。但没那么漂亮:

3.84.to_r
# => (1080863910568919/281474976710656)
因此,使用字符串表示可能更好(编辑:或者更好,使用nice
#rationalize
方法):


如果您可以使用
浮点
,则不需要大小数。如果操作数为零,请使用三元运算符避免运算,并在其他部分提供所需内容。没有“最佳”解决方案,这取决于这些数字的用途。例如,这是货币计算吗?如果是这样,您是否需要处理超过2位小数(用于计算税费等)?请提供更多详细信息。值
3.84
2.53
来自哪里?这些浮点数是已经存在的还是某种用户输入,即字符串?同样,您需要什么样的输出—浮点还是字符串?(或其他)您的“上述问题”是什么?如果您对
float
没有问题,您就不需要大小数。如果操作数为零,请使用三元运算符避免运算&在其他部分提供您想要的任何内容没有“最佳”解决方案,这取决于这些数字的用途。例如,这是货币计算吗?如果是这样,您是否需要处理超过2位小数(用于计算税费等)?请提供更多详细信息。值
3.84
2.53
来自哪里?这些浮点数是已经存在的还是某种用户输入,即字符串?同样,您需要什么样的输出—浮点还是字符串?(或其他什么)你的“上述问题”是什么?我不知道从十进制文字创建有理数可以避免浮点转换。@Stefan它不是十进制文字,而是有理文字:D,但它以任意精度处理小数点。事实上,我一直认为
r
是数字文字的后缀(因为文档这么说),假设
r
.to\r
的语法糖。除了转换成字符串,还有
3.84。rationalize
@Stefan:Derp,我只是同时记住了它:D是的。然而,
r
实际上等同于
\rationalize
可能会失火(例如
0.123456789123456789.rationalize!=0.123456789123456789r
)。我不知道从十进制文字创建有理数可以避免浮点转换。@Stefan它不是十进制文字,而是有理文字:D,但它可以处理任意精度的小数点。事实上,我一直认为
r
是数字文字的后缀(因为文档中这么说)假设
r
的语法糖。to_r
。除了转换成字符串,还有
3.84。rationalize
@Stefan:Derp,我只是同时记住了它:D是的。然而,
r
实际上相当于
\rationalize
可能会失火(例如
0.123456789123456789.rationalize!=0.123456789123456789r
)。