7

重複の可能性:
Java で Double を使用して精度を保持
する double で小数点以下の桁数を移動する

たとえば、次のような単純なものです。

public class WrongAnswer {
  public static void main(String[] args) {
    System.out.println(100*1.1);
  }
}

110 の代わりに 110.00000000000001 を出力します。100*1.1 の代わりに他の数字を使用すると、多くの数字が得られ、末尾にランダムな数字が表示されますが、これは正しくありません。

何か案は?

4

4 に答える 4

9

浮動小数点表記の精度には制限があります。ガイドは次のとおりです:http://floating-point-gui.de/

于 2012-10-22T21:40:40.517 に答える
4

ほとんどの浮動小数点計算には、丸め誤差が含まれます。あなたの場合、2つの丸め誤差があります。(10進数の)1.1を浮動小数点に変換し(IEEE 754浮動小数点では1.1の正確な表現はありません。これは、Javaが使用するものです)、100を掛けます。優れた記事WhatEveryを参照してください詳細については、コンピューター科学者は浮動小数点演算について知っておく必要があります。

于 2012-10-22T21:41:36.107 に答える
3

In100*1.11.1修飾されていないため、デフォルトではdoublewhile100はデフォルトですint
したがって、乗算の結果もdoubleのアップキャストによるもので100あり、それがこの結果を得る理由です。

于 2012-10-22T21:40:05.700 に答える
0

答えたように、それは2倍になるため、形式になります。値を出力するには、関数を次のclosest int/longように使用することをお勧めします。Math.round()

 System.out.println(Math.round(100*1.1));

これは、より正確な数値を乗算する場合に重要になります。

    System.out.println(Math.round(100*1.199));  //--> prints 112
    System.out.println((int)(100*1.199)); //--> prints 111
于 2012-10-22T21:47:27.557 に答える