![](/img/trans.png)
[英]Is it possible to store floating point numbers using perl's vec() function?
[英]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.