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
)。