我希望Math::BigRat 提供一种获取纯数字的方法,它确实做到了:
-
as_int 表示整数
-
as_float 用于花车
出于调试目的,我插入了 $_ 的打印。
$i->as_int() 与int($i) 的作用相同:
$ 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
$i->as_float() 乍一看似乎按预期工作,但我不明白输出。所有小数位均为零,并且每隔一行 $i 等于 $_:
$ 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
这是带有 Math::BigRat 0.2614 的 Perl 5.30.0。
因此警告已修复,但此解决方案似乎有问题。
更新:在没有sprintf的cmets中要求:
$ 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