如何在不损失精度的情况下打印Perl bignum?

如何在不损失精度的情况下打印Perl bignum?,perl,printf,bignum,Perl,Printf,Bignum,使用%f转换的Perl的printf(ActiveState v5.10.1为darwin-thread-multi-2level构建)不支持超过1e-6位的值,即使使用bignum: #!/usr/bin/perl use strict; use warnings; my $s = "1234567890.123456789"; { no bignum; printf "bignum==%s\n", bignum::in_effect() // 0; my $x =

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

#!/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; 
}   
如何在不损失精度的情况下打印输入


我真正的问题是,我需要处理这个数字(例如,$x/0.000\u 000\u 001,或者更糟糕的是,$x/0.000\u 001\u 024,我不能用substr()函数调用来伪造),但在我还没来得及找到“有趣”的部分之前,当前的减量已经难倒了我。

Perl的
printf
并没有真正做大的事情。使用以下方法之一获取字符串。自从做了

$ t.pl
bignum==0
         1234567890.123456789
         1234567890.123456717

bignum==1
         1234567890.123456789
         1234567890.123456717
只要复制字符串,就必须执行以下操作

my $x = $s;
my $x = 0+$s; 
因此,
$x
是一个Math::BigFloat。然后像

my $x = $s;
my $x = 0+$s; 
你应该做你想做的