如何在没有指数表示法的情况下将浮点数作为字符串获取?

Posted

技术标签:

【中文标题】如何在没有指数表示法的情况下将浮点数作为字符串获取?【英文标题】:How do I get a floating point number as a string without the exponent notation? 【发布时间】:2017-09-25 22:28:33 【问题描述】:

如何将浮点数作为没有指数符号的字符串,即以"e-10" 或类似结尾的数字?我发现to_s 返回带有指数符号的数字。

ms = 1457000.0000000002 % 1000 # => 2.3283064365386963e-10
ms.to_s                        # => "2.3283064365386963e-10"

我想得到"0.0000000002",但我没有得到它。

如果我使用上面的示例并评估"%f" % ms,我会得到"0.000000",这与"0.0000000002" 有很大不同。

【问题讨论】:

Ruby: Controlling printing in scientific notation的可能重复 那个解决方案不适合我,虽然。如果您使用我上面的示例并运行“%f”% ms,您会得到“0.000000”,这与“0.0000000002”有很大不同。 嗯,从技术上讲,它并没有太多不同,但可能无法反映您想要的准确性。 “我想得到 0.0000000002” - 为什么你想要 10 位小数而不是 12、15 或 32? 【参考方案1】:

如果您指定小数位数 (DP) %f,我认为它仍然有效。以您的示例为例,输出是 e-10 的指数,因此如果您将 DP 指定为 10 将是准确的。这是一个具体的:

ms = 1457000.0000000002
secs, ms = ms.divmod(1000)
my_answer = '%.10f' % ms

您的输出将是=> "0.0000000002"

【讨论】:

谢谢。如果我事先不知道小数位数怎么办?【参考方案2】:

这似乎是这个问题的重复:

Force Ruby to not output a float in standard form / scientific notation / exponential notation

您可以使用 sprintf 打印格式化的数字:

ms = 1457000.0000000002
sprintf("%.10f", ms)
 => "1457000.0000000002"

请务必注意,浮点数并不完全精确 - 因此,如果您告诉 sprintf 显示更多数字,例如 16,您将看到这种不精确性:

sprintf("%.16f", ms)
=> "1457000.0000000002328306"

强制精度的一个技巧是使用to_r 将值转换为 Rational:

ms = '1457000.0000000002'.to_r
=> (7285000000000001/5000000000)
sprintf("%.16f", ms)
=> "1457000.0000000002000000"

【讨论】:

以上是关于如何在没有指数表示法的情况下将浮点数作为字符串获取?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串

将浮点数转换为字符串

将浮点数转换为字符串而不会丢失精度

如何使用 C 中的常量格式化将浮点数转换为指数

Javascript将浮点数转换为指数[重复]

将浮点数与整数及其二进制表示进行比较