【问题标题】:How to change exponential number format to the floating-point format in Perl如何在 Perl 中将指数数字格式更改为浮点格式
【发布时间】:2011-12-21 19:30:48
【问题描述】:

我在 Perl 中有一个字符串,其中包含一个小数字: $num = "0.00000001";

当我对其进行数值运算时,它会变成指数格式的数字: $num = $num * 100; 打印 "$num\n";

结果是:1e-06

问题是, 如何让这个数字以浮点格式打印,即 0.000001。

我知道我可以用 sprintf("%.6f", $num), 但我想要一个通用的解决方案, 所以我不必每次确定小数点后显示多少位 (如上述 sprintf 示例中的 6)

【问题讨论】:

  • 不要在格式规范中指定小数位数,即只使用sprintf("%f", ...)

标签: perl


【解决方案1】:

当您对$num 应用数值运算时,它会变成一个浮点数。 1e-060.000001 是该数字的文本表示;存储的值不区分它们。

如果您只是简单地打印或字符串化数字,它会使用默认格式,如您所见,结果为"1e-06"。使用sprintf 格式为"%f" 会给你一个合理的结果; sprintf("%f", $num) 产生 "0.000001"

"%f" 格式可能会丢失信息。例如:

$num = "0.00000001";
printf("%f\n", $num);

打印:

0.000000

您说您想打印,而不必每次确定要在小数点后显示多少位。 某事必须做出这样的决定,并且没有普遍正确的方法来做到这一点。显而易见的事情是只打印有效数字,省略尾随零,但这会带来一些问题。你为1.0/3.0打印多少位数字,其十进制表示具有3s的无限序列?而0.00000001 不能用二进制浮点数精确表示:

$num = "0.00000001";
printf("%f\n", $num);    
printf("%.78f\n", $num);

打印:

0.000000
0.000000010000000000000000209225608301284726753266340892878361046314239501953125

【讨论】:

    【解决方案2】:

    使用rodents of unusual size:

    $ perl -Mbigrat -E'$num = 0.00000001; $num *= 100; say $num'
    0.000001
    

    【讨论】:

    • 使用 Perl 5.12,我得到 1/1000000。使用 Perl 5.14,我得到 0.000001
    • 发行版是双活的。您可以独立升级到 0.29,看看是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2010-12-10
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多