数字

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