如果将两个十进制Ruby浮点值转换为字符串并再次转换,是否可以保证它们的准确性?
我试图说服Ruby lib背后处理金钱的人使用BigDecimal,而不是Float 此库显式仅支持两位小数精度。它接受浮点输入(例如,如果将两个十进制Ruby浮点值转换为字符串并再次转换,是否可以保证它们的准确性?,ruby,floating-point,Ruby,Floating Point,我试图说服Ruby lib背后处理金钱的人使用BigDecimal,而不是Float 此库显式仅支持两位小数精度。它接受浮点输入(例如,12.34),将其转换为字符串(12.34.to#s=>“12.34”),并将其发送到API。然后它返回一个字符串金额(“56.78”),并将其转换为浮点(“56.78”。to_f#=>56.78) 我可以在两个十进制浮点数(例如139.25+74.79#=>214.0400000000002)上轻松重现浮点数舍入问题 但假设你不做数学。只需将表示为浮点数的两位
12.34
),将其转换为字符串(12.34.to#s=>“12.34”
),并将其发送到API。然后它返回一个字符串金额(“56.78”
),并将其转换为浮点(“56.78”。to_f#=>56.78
)
我可以在两个十进制浮点数(例如139.25+74.79#=>214.0400000000002
)上轻松重现浮点数舍入问题
但假设你不做数学。只需将表示为浮点数的两位十进制数转换为字符串,然后再转换回来。那么Ruby的浮点值是否保证可靠,或者您能想到任何不可靠的情况吗?对于较大的数字,您可以轻松地超过浮点精度:
"100000000000000.01".to_f #=> 100000000000000.02
此外,计算结果也不会像预期的那样:
(1.2-1.0)==0.2=>false
,其中as:(BigDecimal.new(“1.2”)-BigDecimal(“1.0”)==BigDecimal(“0.2”)=>true
。很好的例子。谢谢大家!@Stefan稍微调整了一下我原来的问题:如果我不做计算,而只是在浮点和字符串格式之间切换,那么两个十进制浮点是否保证在某个值范围内是可靠的?如果该范围的顶部有13或14个零(如您的示例数字),则所有货币的合理货币金额似乎都在安全范围内。@User089247谢谢。是的,我知道计算的问题(并试图在问题中澄清),但想知道如果你不做计算,你是否保证安全。