http://www.nextindex.net/java/class/BigDecimal.html
このサイトに書いてあるとおり、Javaくんは小数点の引き算、割り算が不得意です。
例えば、
5.7-5
という計算式の答えが0.7にならんのですよ。
実際にプログラムを書いてみると、
(プログラムといっても、
System.out.println(5.7-5);
っていう一文だけなんだけど、、、)
0.7000000000000002
という答えが返ってきます。
こりゃ、不思議。
これぞ、知る人ぞ知る、
「コンピュータは2進数の世界である」
という事実からくる誤差なわけで。
で、そうは言っても、
やはり0.7という答えが欲しいので、
そんなときに使うのが、
このBigDecimalクラスです。
多少のパフォーマンスを犠牲にすれば、
10進数計算をしてくれるので、
非常に助かります。
そーんなわけで、
Javaお役立ちサイトシリーズとしてお届けしました3つの知識を駆使して、
作ってみました。
テストプログラム!
…そんなすごいことはできないんですけどね。
<実行結果>
<ソース>
----
一般的にはなじみのないシリーズになってしまいましたが、
備忘録ゆえ、お許しくだされ。
このサイトに書いてあるとおり、Javaくんは小数点の引き算、割り算が不得意です。
例えば、
5.7-5
という計算式の答えが0.7にならんのですよ。
実際にプログラムを書いてみると、
(プログラムといっても、
System.out.println(5.7-5);
っていう一文だけなんだけど、、、)
0.7000000000000002
という答えが返ってきます。
こりゃ、不思議。
これぞ、知る人ぞ知る、
「コンピュータは2進数の世界である」
という事実からくる誤差なわけで。
で、そうは言っても、
やはり0.7という答えが欲しいので、
そんなときに使うのが、
このBigDecimalクラスです。
多少のパフォーマンスを犠牲にすれば、
10進数計算をしてくれるので、
非常に助かります。
そーんなわけで、
Javaお役立ちサイトシリーズとしてお届けしました3つの知識を駆使して、
作ってみました。
テストプログラム!
…そんなすごいことはできないんですけどね。
<実行結果>
C:\>java BdSub 10,000.25 100.05 9,900.2 C:\> |
<ソース>
import java.text.*; import java.math.*; class BdSub{ //引き算 public static void main(String args[]){ BigDecimal bd = margeDigit(args[0]); bd = bd.subtract(margeDigit(args[1])); String s = separateDigit(bd); System.out.println(s); } //BigDecimal型を桁区切りのString文字列へ変換 public static String separateDigit(BigDecimal bd){ String s = ""; try{ NumberFormat nf = NumberFormat.getInstance(); s = nf.format(bd.doubleValue()); }catch(Exception e){} return s; } //桁区切り文字列をBigDecimal型へ public static BigDecimal margeDigit(String s){ BigDecimal bd = null; try{ NumberFormat nf = NumberFormat.getInstance(); bd = new BigDecimal(nf.parse(s).toString()); }catch(Exception e){} return bd; } }
----
一般的にはなじみのないシリーズになってしまいましたが、
備忘録ゆえ、お許しくだされ。