Perl 你如何贬低一个大人物?
滥发大量警告:Perl 你如何贬低一个大人物?,perl,bignum,Perl,Bignum,滥发大量警告: perl -Mbigrat -E'for (1..100) { $i += 1/3; say int($i), "\t", sprintf "%.55f", $i }' 在不使用-Mbigrat的情况下再次运行,以查看sprintf所需的效果 如何将实例$i降级为一个普通的可升级到sprintf 版本: bigrat0.47 Math::BigRat0.2612 答案不那么严肃: Argument "100/3" isn't numeric in addition (+) a
perl -Mbigrat -E'for (1..100) { $i += 1/3; say int($i), "\t", sprintf "%.55f", $i }'
在不使用-Mbigrat
的情况下再次运行,以查看sprintf所需的效果
如何将实例$i
降级为一个普通的可升级到sprintf
版本:
0.47bigrat
0.2612Math::BigRat
- 答案不那么严肃:
Argument "100/3" isn't numeric in addition (+) at …/site_perl/5.24.1/Math/BigRat.pm line 1939.
我希望
Math::BigRat
提供一种获取普通数字的方法,它确实做到了:
- 整数的
as_int
用于浮点数作为浮点数
$\uuu
$i->as_int()
的作用与int($i)
相同:
$i->as_float()
乍一看似乎像预期的那样工作,但我不理解输出。所有小数位均为零,且每第二行$i
等于$\u
:
$ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_int() }'
...
99 33 33.0000000000000000000000000000000000000000000000000000000
100 33 33.0000000000000000000000000000000000000000000000000000000
这是Perl 5.30.0和Math::BigRat 0.2614
因此警告是固定的,但是这个解决方案似乎有问题
更新:根据评论中的要求,不使用sprintf
:
$ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_float() }'
...
90 30 30.0000000000000000000000000000000000000000000000000000000
91 30 91.0000000000000000000000000000000000000000000000000000000
92 30 92.0000000000000000000000000000000000000000000000000000000
93 31 31.0000000000000000000000000000000000000000000000000000000
94 31 94.0000000000000000000000000000000000000000000000000000000
95 31 95.0000000000000000000000000000000000000000000000000000000
96 32 32.0000000000000000000000000000000000000000000000000000000
97 32 97.0000000000000000000000000000000000000000000000000000000
98 32 98.0000000000000000000000000000000000000000000000000000000
99 33 33.0000000000000000000000000000000000000000000000000000000
100 33 100.0000000000000000000000000000000000000000000000000000000
FWIW bigrat@0.39和Math::bigrat在0.2608没有此警告。将bigrat升级到0.47,会带来Math-BigInt-1.999811,但确实有一个警告,但是,
在字符串eq中使用了未初始化的值,位于…/5.22.2/Math/BigFloat.pm第3626行。
手动更新Math::BigRat给了我您的警告。您报告过这个问题吗?如果您省略sprintf并直接将打印为\u float
?看起来你得到的是简化形式的分数的分子,而不是正确的数值。
$ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_float() }'
...
90 30 30.0000000000000000000000000000000000000000000000000000000
91 30 91.0000000000000000000000000000000000000000000000000000000
92 30 92.0000000000000000000000000000000000000000000000000000000
93 31 31.0000000000000000000000000000000000000000000000000000000
94 31 94.0000000000000000000000000000000000000000000000000000000
95 31 95.0000000000000000000000000000000000000000000000000000000
96 32 32.0000000000000000000000000000000000000000000000000000000
97 32 97.0000000000000000000000000000000000000000000000000000000
98 32 98.0000000000000000000000000000000000000000000000000000000
99 33 33.0000000000000000000000000000000000000000000000000000000
100 33 100.0000000000000000000000000000000000000000000000000000000
$ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", $i->as_float() }'
...
90 30 30
91 30 91
92 30 92
93 31 31
94 31 94
95 31 95
96 32 32
97 32 97
98 32 98
99 33 33
100 33 100