如何在不损失精度的情况下打印Perl bignum?
使用%f转换的Perl的printf(ActiveState v5.10.1为darwin-thread-multi-2level构建)不支持超过1e-6位的值,即使使用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 =
#!/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;
你应该做你想做的