Car*_*sap 3 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;
}
Run Code Online (Sandbox Code Playgroud)
使用%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
Run Code Online (Sandbox Code Playgroud)
如何在不丢失精度的情况下打印输入?
我真正的问题是我需要操纵这个数字(例如,$ x/0.000_000_001,或者更糟糕的是,$ x/0.000_001_024,我不能用substr()函数调用来伪装),但是在我能够进入"有趣"部分之前,目前的减少让我感到难过.
Perl's printf
并不真正做bignums.使用Math :: BigFloat方法之一获取字符串.自从做
my $x = $s;
Run Code Online (Sandbox Code Playgroud)
只要复制字符串,你就必须做类似的事情
my $x = 0+$s;
Run Code Online (Sandbox Code Playgroud)
所以这$x
是一个Math :: BigFloat.然后像
printf "%29s\n", $x->ffround(-9);
Run Code Online (Sandbox Code Playgroud)
应该做你想做的事.