• ベストアンサー

桁数指定と四捨五入

Perlで sprintf("%.3f", "19.9996")とすると、 勝手に四捨五入されて、 20.000となります。 私が求めたい値は19.999です。 この場合はどのように記述したら良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.4

1000倍して整数部分での切り捨てを行うのがわかりやすい実装では。 $value = "19.9996"; $value_int = int( $value * 1000 ); # 100倍して整数に。負の値を扱う時はint関数は不適当かもしれません。注意。 $output1 = substr( $value_int, 0, -3 ); # 整数部 $output2 = substr( $value_int, -3 ); # 小数部 print "$output1.$output2"; 厳密な精度を要求する丸め動作は Perl が使用するシステム丸めを信用せず、代わりに自分自身で丸め関数を実装するべきです、とマニュアルにも書かれています。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • W_H
  • ベストアンサー率47% (21/44)
回答No.5

皆さんのすばらしい回答もありますが、参考までにこんなやり方もあるんだ程度に思って貰えれば幸いです。 print &round(19.9996,3); sub round{ my($rit); if($_[0]=~/\./){ my($n,@a,@b); @a=split(/\./,$_[0]); @b=split(//,pop(@a)); push(@a,"."); for($n=0;$n<$_[1];$n++){ push(@a,$b[$n]); } $rit=join("",@a); }else{$rit=$_[0];} return $rit; } 自作関数roundは(数字,少数点以下の桁数)を渡すと、自動的に余分な部分を切り落として、返すものです。 基本的な考え方は、整数値と小数点値に切り分けて、(配列に消えた.を入れて)小数点値を前から指定数分だけ取り出し、配列に入れて最後にドッキングさせています。 自分の求める関数がないなら無理矢理関数を作ってしまうのも手です。 本当に処理も多く、全くオススメできないソースですが、こういうやり方もあります。

すると、全ての回答が全文表示されます。
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

$i = 19.9996; $i -= 0.0005; sprintf("%.3f", $i); というのはどうでしょうか。

すると、全ての回答が全文表示されます。
noname#50176
noname#50176
回答No.2

#1です $a=sprintf("%.4d",$i); は $a=sprintf("%.4f",$i); です。 bazaxさん、このやり方は嫌いなんですよね?

すると、全ての回答が全文表示されます。
noname#50176
noname#50176
回答No.1

$i=19.9996; @a={"0","0",".","0","0","0","0"}; $a=sprintf("%.4d",$i); $a=substr($a,0,5); print("$a\n"); なら出来るのですが、 エスケープシーケンスで切捨ては出来たかな・・・?

すると、全ての回答が全文表示されます。

関連するQ&A