问题:我想将一个数字向下舍入到最接近的 0.01。
这是我想出的解决方案:
return int($_[0]*100)/100;
似乎很好,直到我偶然在调试器中隔离了这个小宝石:
DB<2> p $_[0]
16.78
DB<3> p $_[0] * 100
1678
DB<4> p int($_[0] * 100)
1677
DB<5> p int(16.78 * 100)
1678
一个重要的注意事项是 $_[0] 最初是从一些文本中删除的。似乎 Perl 将文本“16.78”表示为 16.78 减去一些 epsilon 的数字,但将其打印为“16.78”。
PS POSIX::floor 以同样的方式失败。
到西班牙:
啊,但是如果输入是 16.7799 呢?
use strict;
use warnings;
my $float = 16.7799;
my $not_rounded = int($float*100)/100;
my $sprintf_rounded = sprintf "%.2f", $float;
my $int_rounded = int( ($float+0.005) * 100 )/100;
print "first method: " . $not_rounded ."\n"; # => 16.77
print "second method: " . $sprintf_rounded ."\n"; # => 16.78
print "third method: " . $int_rounded . "\n"; # => 16.78
结果应该是 16.77,但在这里它们是:
$ perl test.pl
first method: 16.77
second method: 16.78
third method: 16.78
所以,换个说法,我想向下取整到最接近的百分之一,但在输入接近整数倍的情况下向上取整,可以用浮点数表示,但不超过百分之一。
例如,如果输入是 16.77999999999999758415,这既是 0.01 (16.78) 的最接近倍数的最准确表示,也小于该数字,则向上舍入到最接近的 0.01,否则向下舍入到最接近的 0.01。
请注意,我的操作假设是当 Perl 设置从可以解释为浮点小数的文本中刮取的标量时,它将选择最准确的表示形式。大概是合理的。