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

时间:2011-03-24 23:22:20

标签: perl printf 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; 
}   

使用%f转换的My Perl的printf(为darwin-thread-multi-2level构建的ActiveState v5.10.1)不会使我的值超过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()函数调用),但是在我甚至可以进入“有趣”的部分之前,目前的减少让我感到难过。

1 个答案:

答案 0 :(得分:9)

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

my $x = $s;

只需复制字符串,您就必须执行类似

的操作
my $x = 0+$s; 

以便$x是Math :: BigFloat。然后像

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

应该做你想做的事。