簡體   English   中英

為什么Perl的sprintf不能正確舍入浮點數?

[英]Why does Perl's sprintf not round floating point numbers correctly?

我一直在尋找Perl內置函數sprintf使用的舍入約定。

我認為它進行了正常的舍入(例如在Java的舍入模式約定中的 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

你被浮點數不是十進制分數的精確表示這一事實所困擾。 這是我得到的:

  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。

這是IEEE浮點數的函數。

有關更多信息,請參閱Perl上下文,請參閱Perlfaq4“Perl是否具有round()函數” ,特別是關於中間點交替的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM