這裏是一個Perl腳本:爲什麼Perl與sprintf舍入不一致?
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @numbers = qw(
0.254
0.255
0.256
);
foreach my $number (@numbers) {
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}
foreach my $number (@numbers) {
$number += 100;
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}
它輸出:
0.254 => 0.25
0.255 => 0.26
0.256 => 0.26
100.254 => 100.25
100.255 => 100.25
100.256 => 100.26
對我來說這是非常奇怪的是,Perl是與舍入不一致。我想到的是要舍都數以.255結尾爲0.26這是0.255真實的,但它是數100.255
這裏假是Perl的食譜http://docstore.mik.ua/orelly/perl/cookbook/ch02_04.htm
sprintf的報價。 f格式可讓您指定特定數量的小數位數 以將其參數舍入爲。 Perl會查看下面的數字,如果它是5或更大,則 會舍入,否則將舍入。
但我不能看到任何證據證明它是正確的http://perldoc.perl.org/functions/sprintf.html
它是一個在錯誤的sprintf或Perl食譜是錯的?如果這是理想的行爲,爲什麼它以這種方式工作?
似乎也會影響'%g':'perl -E'printf「%.3g \ n」,1.505''爲1.5,而'perl -E'printf「%.3g \ n」,1.506''給出1.51。同樣,'perl -E'printf「%.2g \ n」,0.505''和'perl -E'printf「%.2g \ n」,0.506''給出0.51 –
您正在使用兩個舍入數字。相反,使用'說sprintf'%1 $ .19g =>%1 $ .2f',$ number;'。這將回答你的問題。 – ikegami
Re * * Perl會查看下面的數字,如果它是5或更大,則向上舍入,否則捨棄。*「,這是不準確的。這完全取決於底層C庫,它可能不一定使用該舍入方法。事實上,在我的gcc構建中,它甚至達到了。(但這與您的問題無關。) – ikegami