【问题标题】:How can I printf a Perl bignum without losing precision?如何在不丢失精度的情况下打印 Perl bignum?
【发布时间】:2011-03-24 23:22:20
【问题描述】:
#!/usr/bin/perl
use strict;
use warnings;
my $s = "1234567890.123456789";
{   
    no bignum; printf "bignum==%s\n", bignum::in_effect() // 0;  
    my $x = $s; 
    printf "%29s\n", $x; 
    printf "%29.9f\n\n", $x; 
}   
{   
    use bignum; printf "bignum==%s\n", bignum::in_effect() // 0;
    my $x = $s; 
    printf "%29s\n", $x; 
    printf "%29.9f\n\n", $x; 
}   

我的 Perl 的 printf(为 darwin-thread-multi-2level 构建的 ActiveState v5.10.1)使用 %f 转换不支持超过 1e-6 位的值,即使使用 bignum:

$ t.pl
bignum==0
         1234567890.123456789
         1234567890.123456717

bignum==1
         1234567890.123456789
         1234567890.123456717

如何在不丢失精度的情况下打印我的输入?

我的真正问题是我将需要操纵这个数字(例如,$x/0.000_000_001,或者更糟糕的是,$x/0.000_001_024,我无法伪造使用 substr() 函数调用),但当前的消减已经让我很难过,我什至还没有进入“有趣”的部分。

【问题讨论】:

    标签: perl printf bignum


    【解决方案1】:

    Perl 的printf 并没有真正做bignums。使用Math::BigFloat 方法之一获取字符串。自从做了

    my $x = $s;
    

    只需复制字符串,您必须执行类似的操作

    my $x = 0+$s; 
    

    所以$x 是一个 Math::BigFloat。然后像

    printf "%29s\n", $x->ffround(-9);
    

    应该做你想做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2012-05-03
      相关资源
      最近更新 更多