sprintf
数値を丸める正確な方法は、システム ライブラリが数値を丸める方法によって異なります。数値の丸め方法を正確に制御する必要がある場合は、目的の丸めを明示的に実装するライブラリを使用するか、必要に応じて丸める関数を作成する必要があります。
たとえば、正の数を任意の精度に丸めるには、5 を切り上げます。
sub round {
my $numer = shift;
my $precision = shift;
return int($numer * 10 ** $precision + 0.5) * 10 ** -$precision;
}
ただし、これは負の数に対して正しく丸められません。-0.12324 は誤って -0.1231 に丸められます。5 が切り上げられる (つまり、正の無限大に向かう) 解決策は、floor
の代わりに使用することですint
。
use POSIX qw(floor);
sub round {
my $numer = shift;
my $precision = shift;
return floor($numer * 10 ** $precision + 0.5) * 10 ** -$precision;
}
代わりに、5 を最大の絶対値に丸める (つまり、0 から遠ざけるように丸める) 必要がある場合は、負の数の単純なチェックを追加して、それらを正しい方向に丸めることができます。
sub round {
my $numer = shift;
my $precision = shift;
my $direction = $numer >= 0 ? 0.5 : -0.5;
return int($numer * 10 ** $precision + $direction) * 10 ** -$precision;
}
すべての数値に対して 5 を一方向に丸めることによる偏りが許容されず、浮動小数点数の (10 進数の) 丸めがバイナリ形式の不正確さによるエラーの可能性がある状況で使用される丸めには、より複雑な規則があります。