数字

October 25, 2013 @ 02:53 PM

小心地测试浮点数的相等性

在计算中过度相信 IEEE 浮点数是一种错误。例如:

  1. print "---\n";
  2. print "A: ", 2.4, "\n";
  3. print "B: ", 0.2*12, "\n";
  4. if ( 0.2*12 == 2.4 ) {
  5. print "These are equal.\n";
  6. }
  7. else {
  8. print "These are not equal.\n";
  9. }
  10. A: 2.4
  11. B: 2.4
  12. These are not equal.

这样的结果是由于这个事实: 0.2 (1/5) 在 IEEE 空间无法被表示为二进制分数。

因此,如果你想要检查浮点数的相等性,那么可以使用 sprintf 或类似的东东。

参阅 http://perldoc.perl.org/perlfaq4.html 了解细节。

数字舍入

不要使用 int() 来做数字舍入,它只会返回整数部分。sprintf()printf() 一般够用了。

  1. printf("%.3f", 3.1415926535); # prints 3.142

如果你需要向下或向上舍入,那么可以使用 POSIX 模块所提供的 ceil()floor() 函数。其中,ceil() 是向上舍入,而 floor() 是向下舍入。

  1. use POSIX;
  2. my $ceil = ceil(3.5); # 4
  3. my $floor = floor(3.5); # 3