【java解惑】doubleによる小数演算



次のコードがあります.
public class Example002 {
	public static void main(String args[]) {
		System.out.println("println:( 2.00 - 1.10) = " + (2.00 - 1.10));
		System.out.printf("printf:( 2.00 - 1.10) = %.2f%n", 2.00 - 1.10);
		System.out.println("BigDecimal:( 2.00 - 1.10) ="
				+ new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
	}
}

出力結果:
println:( 2.00 - 1.10) = 0.8999999999999999
printf:( 2.00 - 1.10) = 0.90
BigDecimal:( 2.00 - 1.10) =0.90

原因分析:1.1この数字はdoubleとして正確に表現できないため、doubleに最も近い値として表示されます.このプログラムが2から減算したのがこの値です.もっと根本的な問題は、すべての小数点数がバイナリ浮動小数点数で正確に表現できるわけではないということです.結果を正しく印刷できるようにするには、上記のようにprintfを使用してフォーマットすることができる.もう1つの方法は、BigDecimalを使用してサポートを提供することです.BigDecimalを使用するには、直接new BigDecimal(double)の構造ではなく、文字列の構造関数を使用することに注意してください.
出力をフォーマットする文字列の桁数も参照できます.http://mouselearnjava.iteye.com/blog/1961008
(注:本【java解惑】シリーズは、いずれもブロガーが『java解惑』を読む原書の後、原書の説明と例の部分を改編し、博文として発表した.すべての例は自らテストに合格しgithubで共有された.これらの例を通じて、自分を励まし、他人に恩恵を与える.同時に、このシリーズのすべてのブログは、ブロガー個人の微信公衆番号(「愛題猿」または「ape_it」を検索する)に同期して公開されます.)、みんなが読むのに便利です.もし文の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.読者が文の内容に異議や問題がある場合は、ブログの伝言や微信の公衆番号の伝言などを通じて共同で検討することを歓迎します.)
ソースアドレス:https://github.com/rocwinger/java-disabuse
 
本文は“winger”のブログから出て、転載をお断りします!