为什么Perl的sprintf不能正确舍入浮点数?

时间:2009-10-30 18:53:47

标签: perl floating-point printf

我一直在寻找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

2 个答案:

答案 0 :(得分:16)

你被浮点数不是小数部分的精确表示这一事实所困扰。这是我得到的:

  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,因此其回合为.34,而1.335略低于1.335,因此它将转为1.33。

答案 1 :(得分:6)

这是IEEE浮点数的函数。

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

相关问题