1. ホーム
  2. java

[解決済み] Javaでdoubleを使用して精度を保持する

2022-04-23 19:42:02

質問

public class doublePrecision {
    public static void main(String[] args) {

        double total = 0;
        total += 5.6;
        total += 5.8;
        System.out.println(total);
    }
}

上記のコードは印刷されます。

11.399999999999

これを11.4と印字するだけ(として使えるようにする)にはどうしたらいいのでしょうか?

どのように解決するのですか?

他の方もおっしゃっているように、おそらくは BigDecimal クラスは、11.4 を正確に表現したい場合に使用します。

さて、なぜこのようなことが起こるのか、少し説明します。

その floatdouble Java のプリミティブ型は 浮動小数点 ここで、数値は分数と指数の2進表現として格納されます。

具体的には、倍精度の浮動小数点値である、例えば double 型は64ビットの値であり、ここで

  • 1ビットは符号(正または負)を表す。
  • 11ビットで指数を表す。
  • 有効数字(2進数としての分数部)用52ビット。

これらのパーツを組み合わせることで double を表現する。

(出典 ウィキペディア 倍精度 )

Javaでの浮動小数点値の扱い方の詳細については セクション 4.2.3: 浮動小数点型、フォーマット、および値 の「Java言語仕様」を参照してください。

byte , char , int , long タイプは 固定小数点 は、数を正確に表現したものです。固定小数点数とは異なり、浮動小数点数は正確な数値表現を返せないことがあります(ほとんどの場合、quot;と考えてよいでしょう)。このため 11.399999999999 の結果として 5.6 + 5.8 .

1.5や150.1005のように正確な値が必要な場合は、その数を正確に表現できる固定小数点型のいずれかを使用することになります。

すでに何度か触れているように、Javaには BigDecimal クラスは、非常に大きな数と非常に小さな数を処理することができます。

のJava APIリファレンスより。 BigDecimal クラスがあります。

イミュータブルです。 任意精度の符号付き10進数 の数値です。BigDecimalは、以下の要素から構成されます。 任意精度の整数(未スケール と32ビット整数の目盛りがあります。もし ゼロまたは正の場合、スケールは の右側の桁数。 小数点以下が表示されます。負の場合は スケールされていない数値は の10乗を乗じたものです。 の否定を行う。の値は で表される数値は したがって、BigDecimal は (unscaledValue) となります。 × 10^-スケール)。

Stack Overflowには、浮動小数点数とその精度に関する質問が多数寄せられています。ここでは、関連する質問のうち、参考になりそうなものをリストアップしています。

浮動小数点数について本当に詳しく知りたい方は、以下をご覧ください。 浮動小数点演算についてコンピュータ科学者が知っておくべきこと .