- - PR -
BigDecimalの計算について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-11-25 13:29
みーちくと申します。
宜しくお願いいたします。 BigDecimal型を使用して、計算を行っております。 計算の仕様は下記の通りです。 ・小数第3位を四捨五入 ・1000.00%以上の場合は、999.99%を表示する メソッドを作成し、小数第3位を四捨五入はできたのですが、 表示がうまくいきません。 下記のコードを実行した場合、6666.70%と返されます。 DecimalFormatを使用しない場合の計算、66.667です。 私としては、66.70が返されるのかなと思ったのですが、違ってました。 DecimalFormatを使用しないで、setScale()をすればよいのでしょうか? 宜しくお願い致します。
| ||||
|
投稿日時: 2005-11-25 13:58
APIには、下記の通りにあります。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/text/DecimalFormat.html % 接頭辞または接尾辞 あり 100 倍してパーセントを表す というわけで、「".00%"」の場合、これは演算結果が「0.667」のときに 「66.70%」と表示するためのパターンです。 みーちくさんの場合、自分で100を掛けてらっしゃいますから「6667.00%」になるのです。 | ||||
|
投稿日時: 2005-11-25 13:59
こんにちわ。
DecimalFormatでフォーマットパターンに「%」を指定した場合は、 DecimalFormat側で自動的に100倍してパーセント表示します。 詳細については、DecimalFormatのJavaDocに書いてありますよ。 なので、ロジックで100倍する必要がなく、 bd1 = bd1.multiply(new BigDecimal("100")); 部分をコメントアウトすれば、みーちくさんの意図通りの結果になると思います。 | ||||
|
投稿日時: 2005-11-25 13:59
DecimalFormatが、フォーマット文字列中の"%"を検知して
自動的に百分率表記(=BigDecimalが所有する値を100倍に する)に変換してくれているのではないでしょうか。 | ||||
|
投稿日時: 2005-11-25 14:23
Edossonさん、さぷりさん、シュンさん
返信ありがとうございました。 DecimalFormatで指定していたのですね。 APIの確認をしておりませんでした。 皆様、ありがとうございました。 | ||||
|
投稿日時: 2005-11-25 14:31
解決したあとでなんですが。
「66.70%」と表示される数値は、 100分率の場合は、「有効桁数4桁」と見なされるべきものです。 3桁だったら「66.7%」と表示します。 [追記] いや、「100分率小数部有効桁数2桁で66.70」でいいのか。 でも、実際は「小数部2桁目」で四捨五入してるし。ううむ。 [/追記]
この仕様にしてからが、有効桁数2桁と4桁の仕様が混じってますので、 どちらか一方に統一されることをお勧めします。 [追記] 「3桁」を「2桁」に修正 [/追記] 先に書いておくべきでしたね。 [追記] そもそもBigDecimalのscaleに3を指定すると、「小数第3位を四捨五入」になりませんぞ。 つっこんだところがつっこみどころ満載で、 なんか、いろいろ恥ずかしいなあ・・・。orz [/追記] [ メッセージ編集済み 編集者: Edosson 編集日時 2005-11-25 15:26 ] |
1