はてなキーワード: BigDecimalとは
なんか今頃になって小数の丸め誤差の話が盛り上がってるんだけど
そもそもできる限り小数を使わないっていうのはプログラミングの基本でしょ
割と適当でいいものについては小数(float)を使うけど厳密なところは整数(integer)にしましょうって最初に習わないの?
例えば日本だとあんまり馴染みが無いけれど海外だと金額はだいたいが小数で扱われてて
$5.3-$2.8 みたいな計算をするんだけど
ところがそもそもドルじゃなくてセントにしてしまえば何も問題は起きない
システムで扱う単位をセントにしておいて表示するときにドルにすればいいだけ
他にも長さを入れるときにメートルで入れると小数を使わないといけなくなるからミリメートルで入れる、とか
時間も秒単位だと誤差がでるからミリ秒とかマイクロ秒で入れる、とか
精度が求められてないとかそもそも精度に意味が無い場合は小数使えばよくて
まぁUnixtimeがfloatで入ってても問題無い場面はあるとは思うけどね
DecimalだとかBigDecimalだとか議論する前に本当に小数計算が必要なのかよく考えて欲しい
※架空言語、という事にしておいてほしいんだが
List<Record> rows = DBから持ってくる(); // 合計金額を求める String total = "0"; for (Record r : rows) { BigDecimal temp = BigDecimal.parse( カンマを削除する関数(total) ); BigDecimal temp2 = temp + r.金額; total = カンマ区切りの文字列にする関数(temp2); } // やったー合計金額を計算してカンマ区切りの文字列にできたよー return total;
とか
// async await は非同期処理を同期してくれる魔法の言葉だって!よく知らんけど await axios.get('/foo') .then(function(result) { // やったー結果が得られたよー });
とか
正直なところ、こういうコードのお守りするの、そろそろキツい。。。
ビッグで絞まる*^_^*
BigDecimal result = new BigDecimal("100000").multiply(new BigDecimal("99999.55")).add(new BigDecimal("3333333333"));
BigDecimal result = BigDecimal("100000") * "99999.55" / "3333333333";
http://d.hatena.ne.jp/j5ik2o/20091024/1256369305 の
// 1.0 - 9 * 0.1 BigDecimal b1 = new BigDecimal(1.0); BigDecimal b2 = new BigDecimal(-9); BigDecimal b3 = new BigDecimal("0.1"); BigDecimal result = b1.add(b2.multiply(b3)); System.out.println(result.toString());
を見て悲しくなった。Javaってひどい。0.1は文字列で渡さないと誤差が出るってさ。泣ける。
C#なら
Console.WriteLine( 1.00M - 9M * .10M );
でOK