为什么Perl';s sprintf是否对浮点数进行了正确的四舍五入?

为什么Perl';s sprintf是否对浮点数进行了正确的四舍五入?,perl,floating-point,printf,Perl,Floating Point,Printf,我正在寻找Perl内置函数使用的舍入约定 我原以为它是正常的四舍五入(如中的四舍五入),但进一步挖掘证明这是错误的: > /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内置函数使用的舍入约定

我原以为它是正常的四舍五入(如中的四舍五入),但进一步挖掘证明这是错误的:

> /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

浮点数并不是小数的精确表示形式,这一事实让您大吃一惊。以下是我得到的:

  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> 
DB$a=0.335
DB print sprintf(“%.19f”,$a)
0.3350000000000000200
DB$b=1.335
DB print sprintf(“%.19f”,$b)
1.3349999999999999645
分贝

由于0.335在内部表示为略大于0.335,因此它舍入为.34,而1.335则略小于1.335,因此舍入为1.33。

这是IEEE浮点数的函数

有关Perl上下文中的更多信息,请参阅,特别是关于中途点交替的说明。

print(sprintf(…)?我想知道是否有一个“printf”…请看一看,以获得更完整的解释