3
#!/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変換を使用する私のPerlのprintf(darwin-thread-multi-2level用に構築されたActiveState v5.10.1)は、bignumを使用している場合でも、1e-6桁を超える私の値を尊重しません。

$ t.pl
bignum==0
         1234567890.123456789
         1234567890.123456717

bignum==1
         1234567890.123456789
         1234567890.123456717

精度を損なうことなく入力を印刷するにはどうすればよいですか?

の本当の問題は、この番号を操作する必要があることです(たとえば、$ x / 0.000_000_001、さらに悪いことに、substr()関数呼び出しでは偽造できない$ x / 0.000_001_024)。私が「楽しい」部分に到達する前に、現在の削減は私を困惑させました。

4

1 に答える 1

9

Perlprintfは実際にはbignumを実行しません。文字列を取得するには、 Math::BigFloatメソッドの1つを使用します。やってから

my $x = $s;

文字列をコピーするだけで、次のようなことをする必要があります

my $x = 0+$s; 

これが$xMath::BigFloatです。次に、

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

あなたがやりたいことをする必要があります。

于 2011-03-25T00:09:00.620 に答える