• ベストアンサー

桁数指定と四捨五入

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

  • 四捨五入に関して

    すでに似たような四捨五入の質問&回答が載ってますが、 自分のパターンは上手くいきませんでした。 例えば、"17174.7655"という数字を"17180"みたいに1桁目まで四捨五入をしたい場合、どのように記述すれば良いのでしょうか? また、Format関数を使用するとどのような書き方になりますか?

  • アクセスで四捨五入

    アクセスでの四捨五入を教えてください。 千の値で丸めたいです・・・ <例> 2,499 ⇒ 2,000 1,800 ⇒ 2,000 2,500 ⇒ 3,000 百の位を見て、四捨五入し、千円単位で丸めたいです。 よろしくお願いします。

  • 四捨五入について教えてください

    四捨五入について教えてください。 一桁の数字の1から9は四捨五入するといくつになるのですか? また、0や10や20の数字は四捨五入するといくつになるのですか? 宜しくお願い致します。

  • 四捨五入について

    とあるテキストに、3.848を四捨五入して小数点第一位まで求めると、3.8になる、と書いてあります。しかし、3.848の小数点第三位の8を四捨五入すると、3.85になり、これを更に四捨五入すると、3.9になるように思うのですが、いかがでしょうか?

  • ROUND関数で、四捨五入ができない。

    ROUND関数で、四捨五入ができない。 カラムの値が'8.5'の場合'9'になるはずなのですが、'8'となってしまいます。 解決方法ありますでしょうか? '4.5''6.5'の場合でも、四捨五入ができないです。 SELECT カラムA,ROUND(カラムA) FROM テーブル ----------------------------------------  カラムA |  ROUND(カラムA) ----------------------------------------   5.5   |   6          ←四捨五入ができている ----------------------------------------   8.5   |   8          ←四捨五入ができない ----------------------------------------   4.5   |   4          ←四捨五入ができない ---------------------------------------- XAMPP 1.7.3の MySQL 5.1.41を使用しています。

    • ベストアンサー
    • MySQL
  • 有効数字(有効桁数)と四捨五入について・・・。

    自分は現在高校生です。物理化学数学でカテゴリ迷ったのですがこちらに。 四捨五入、有効数字に関する質問は過去にもあるのですが、何か腑に落ちないので質問させて貰います。 学校では、 http://www.fnorio.com/0034significant_figure1/significant_figure.htm にあるように、「有効数字+1桁までを計算して結果を出し、その結果を有効数字にまとめろ」と習います。 しかしこれをやってしまうと、以下有効数字による表記として、 ア・・・1.1+1.445=2.545→(有効数字2桁なので四捨五入)→2.5 イ・・・1.1+1.445→(まず有効数字を3桁にしてみる) →1.1+1.45=2.55→(有効数字2桁なので四捨五入)→2.6 となり答えが違ってきます。 じゃあ有効数字+2桁まで計算すればいいのかと思うと、 ウ・・・1.1+1.4495=2.5495→(有効数字2桁なので四捨五入)→2.5 エ・・・1.1+1.4495→(有効数字4桁にしてみる)→1.1+1.450=2.550→(有効数字2桁なので四捨五入)→2.6 となりやっぱり答えが変わるパターンがあります。 乗除については、 (四捨五入せずに)積を計算→結果を有効数字+1桁に変換→・・・ なんてことを繰り返していると+1桁程度では厳密に計算したものとかなり違ってくると思います。 実際、高校の物理や化学ではア~エは全部正解にしてくれると思うのですが(エはよく分かりませんが・・・)、数学的にはどうなのでしょうか。 また、誤差の大きくなってしまう乗除はどうすればいいのでしょうか。

  • 小数点の四捨五入で分からないことがあります

    例えば、0.230978という値を小数点第4位を四捨五入したら、答えは0.231ですか?それとも0.2310が答えですか? また、0.8という値を小数点第1位を四捨五入したら、答えは1.0ですか?それとも1ですか? よろしくお願いします。

  • 四捨五入について

    今、SELECT文で取得した値をround()を使って四捨五入したいのですが、構文エラーになります。 SELECT ROUND( SELECT 0.2*(SLECT number FROM sample WHERE id =1) ); ROUND()内のSELECT 0.2*(SLECT number FROM sample WHERE id =1) で、値が12,6のように返ってきます。 しかし、round()で四捨五入して13を取得しようとすると構文エラーになります。 どうしたらいいのでしょうか? よろしくお願い致します。

  • 四捨五入、丸め・・・?

    たとえば、235.4を小数点第一位で「四捨五入」すると、236ですよね。 334を330に、336を340にするような場合は、なにか言い方がありますか? わかりにくくてすみません。

  • 四捨五入、簡単そうで、出来ません・・・

    お世話になります。 さて、 18643.52 この数字を、まず、小数点を四捨五入して 18644 とします。 次に、 18644の数字を、四捨五入して、 18640 としたいです。 一気に、18643.52 から 18640 とする方法は ありますか? 教えて下さい。

このQ&Aのポイント
  • 調剤薬局のクラフト(さくら薬局を運営)が1000億円の債務を抱えて倒産しました。なぜ、薬を提供するだけの絶対に経営でマイナスにならないはずの調剤薬局が巨額の債務を抱えたのでしょうか?
  • 在庫を抱えすぎて倒産はありえないはずの薬局が、なぜ1000億円もの債務を抱えて倒産したのでしょうか?薬の消費期限は食品より長いため、そもそも在庫の問題はあるのでしょうか?
  • さくら薬局が倒産した原因にはいくつかの要素が考えられます。例えば、病院との提携やビジネスモデル、ドラッグストア化に失敗したことなどが挙げられます。なぜさくら薬局はコケたのでしょうか?
回答を見る