08/10/17 02:10:43
>>365
具体的にはこういうもの。
URLリンク(javafaq.jp)
[S029-Q01]
doubleの演算で1.1 + 2.2が 3.3にならず 3.3000000000000003 になるのはなぜですか?
[S029-A01]
丸め誤差のせいです。
double型が内部的に64ビットの浮動小数点で数値を表現している
ために「丸め」が発生しているためです。
内部の計算を2進数で行っている以上「丸め」は避ける事が
できないので、必要に応じて内部の計算を10進数で行う
java.math.BigDecimalを使いましょう。
[S029-Q02]
double, floatの計算で0になるはずのものが0にならないのはなぜですか?
[S029-A02]
丸め誤差のせいです。
通常の数値計算ルーチンは数値はすべて2進数扱いしますが、
2進数では10進数の小数を表現しきれないためにこういう現象がおこります。
2進数の桁は2の累乗扱いになるわけですが、
小数だと、2の-1乗(つまり1/2)、2の-2乗(1/4)という単位になります。
したがって、2のマイナス何乗かの数値の合成でうまく表現できない
数値は無限小数になって、最後の桁を切り捨てした部分の
誤差ができてしまいます。
対処方法としては、内部の計算を10進数で行う
java.math.BigDecimalを使いましょう。