【问题标题】:Why does Perl's sprintf not round floating point numbers correctly?为什么 Perl 的 sprintf 不能正确舍入浮点数?
【发布时间】:2010-12-11 17:18:50
【问题描述】:

我正在寻找 Perl 的内置函数 sprintf 使用的舍入约定。

我认为它会进行正常的舍入(例如,Java's rounding mode convention 中的 ROUND_HALF_UP),但进一步挖掘证明这是错误的:

> /usr/local/bin/perl5.10.1 -e 'print(sprintf("%.2f", shift @ARGV)."\n");' 0.335
0.34
> /usr/local/bin/perl5.10.1 -e 'print(sprintf("%.2f", shift @ARGV)."\n");' 1.335
1.33

【问题讨论】:

标签: perl floating-point printf


【解决方案1】:

浮点数不是小数的精确表示,这让您感到困扰。这是我得到的:

  DB<1> $a=0.335

  DB<5> print sprintf("%.19f",$a)
0.3350000000000000200
  DB<7> $b=1.335

  DB<8> print sprintf("%.19f",$b)
1.3349999999999999645
  DB<9> 

由于 0.335 在内部表示为略大于 0.335,因此四舍五入为 0.34,而 1.335 略小于 1.335,因此四舍五入为 1.33。

【讨论】:

    【解决方案2】:

    这是 IEEE 浮点数的函数。

    有关更多信息,在 Perl 上下文中,请参阅 Perlfaq4 "Does Perl have a round() function",尤其是它关于中途点交替的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多