Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果将两个十进制Ruby浮点值转换为字符串并再次转换,是否可以保证它们的准确性?_Ruby_Floating Point - Fatal编程技术网

如果将两个十进制Ruby浮点值转换为字符串并再次转换,是否可以保证它们的准确性?

如果将两个十进制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)上轻松重现浮点数舍入问题 但假设你不做数学。只需将表示为浮点数的两位

我试图说服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
)上轻松重现浮点数舍入问题


但假设你不做数学。只需将表示为浮点数的两位十进制数转换为字符串,然后再转换回来。那么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谢谢。是的,我知道计算的问题(并试图在问题中澄清),但想知道如果你不做计算,你是否保证安全。