我一直在寻找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
答案 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",特别是有关中途点交替的内容。