数字
October 25, 2013 @ 02:53 PM
小心地测试浮点数的相等性
在计算中过度相信 IEEE 浮点数是一种错误。例如:
print "---\n";
print "A: ", 2.4, "\n";
print "B: ", 0.2*12, "\n";
if ( 0.2*12 == 2.4 ) {
print "These are equal.\n";
}
else {
print "These are not equal.\n";
}
A: 2.4
B: 2.4
These are not equal.
这样的结果是由于这个事实: 0.2 (1/5) 在 IEEE 空间无法被表示为二进制分数。
因此,如果你想要检查浮点数的相等性,那么可以使用 sprintf
或类似
的东东。
参阅 http://perldoc.perl.org/perlfaq4.html 了解细节。
数字舍入
不要使用 int()
来做数字舍入,它只会返回整数部分。sprintf()
或
printf()
一般够用了。
printf("%.3f", 3.1415926535); # prints 3.142
如果你需要向下或向上舍入,那么可以使用 POSIX 模块所提供的 ceil()
和 floor()
函数。其中,ceil()
是向上舍入,而 floor()
是向下舍入。
use POSIX;
my $ceil = ceil(3.5); # 4
my $floor = floor(3.5); # 3