#!perl -w use Math::Round; use strict; { # ========================================================================= # Test Case(3) # ========================================================================= my @v = (555.555, -555.555); print "=================================\n"; print "Case3 : ", join(", ",@v), "\n"; # ========================================================================= # sprintf使用 # ========================================================================= print "---------------------------------\n"; print "/1 : ", sprintf("%.0f,\t%.0f", @v), "\t# sprintf\n"; # 小数点0桁(整数)化 print "/0.1 : ", sprintf("%.1f,\t%.1f", @v), "\t# sprintf\n"; # 小数点1桁化 print "/0.01 : ", sprintf("%.2f,\t%.2f", @v), "\t# sprintf\n"; # 小数点2桁化 # ========================================================================= # round_alt(自作関数)使用 # ========================================================================= print "---------------------------------\n"; print "/0 : ", join(",\t", round_alt(0, @v)), "\t# round_alt\n"; # 整数化 print "/0.1 : ", join(",\t", round_alt(-1, @v)), "\t# round_alt\n"; # 小数点1桁化 print "/0.01 : ", join(",\t", round_alt(-2, @v)), "\t# round_alt\n"; # 小数点2桁化 } sub round_alt { my $digit = shift; # 四捨五入対象の桁指定を取り出す my @v = @_; # 残りはデータとして@vに入れる # 数値データの内容を見て処理 for (my $i=0; $i<@v; $i++) { my $is_float = 0; $is_float = 1 if ($v[$i] =~ /\./); # 小数点を持つ数値なら $is_float = 1; if ($is_float) { # 小数点を持つ数値ならば # 小数点以下の桁数をカウントする my $col_float = 0; for (my $j=length($v[$i])-1; $j>=0 ; $j--) { # 文字列として後ろから見る my $ch = substr($v[$i], $j, 1); # 文字取り出し if ($ch ne '.') { $col_float-- } # 小数点桁数カウント(-値) else { last } # 小数点ならカウント終了。2桁なら-2になる。 } # 数値の小数点桁数が四捨五入対象桁より多いか比較 # * 少ない場合は切り捨てになるだけ # * 多い場合でかつ末尾が'5'のとき'6'に変更 if ($digit > $col_float) { $v[$i] =~ s/5$/6/ if ($v[$i] =~ /5$/); } } } # 処理後の数値をMath::Round::nearestに渡す。桁指定は10のべき乗にする。 my $target = 10**($digit); # 1e($digit)でも良い。10**(-2) = 0.01 return(Math::Round::nearest($target, @v)); }