1

私は現在、0.00000000001 などの小さな定数値を double 変数に追加する必要がある Java のプログラムに取り組んでいます。位置。ただし、コードを実行してデバッグすると、ロケーションに 0.00000000001 を追加した場所に到達し、追加後にデバッグ モードでロケーションの値を確認します。location に 0.00000000001 が追加されていないようです。たとえば、ロケーションは、追加前は 438.0、追加後は 438.0 になります。これは、単純なコードがどのように見えるかの例です

場所 += 0.00000000001

何か案は?前もって感謝します。

4

7 に答える 7

6

多くのdouble値は、格納方法が原因でJavaでは正確ではありません。正確な精度は、特定の値にのみ適用されます。これは、Javaが10進値を多くの2 ^ n(s)の組み合わせとしてしか格納できないためです。

例:1/4として保存できますが2^-2、として1/3保存される2^-2 + 2^-3+ 2^-4 +2^-5...ため、1/3正確ではない値の例です。

正確な値が必要な場合は、次のBigDecimalクラスを使用してください。

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

于 2012-06-13T14:45:34.903 に答える
5

精度を上げるには、 BigDecimalを使用する必要があります。

例:

BigDecimal test = new BigDecimal(438.0);
test = test.add(new BigDecimal(0.0000000000001));
System.out.println(test);
于 2012-06-13T14:45:45.080 に答える
4

BigDecimalクラスを使用します。これは任意精度であり、小さな値を処理できます。

于 2012-06-13T14:45:58.943 に答える
2

非常に小さな値を追加する精度を超えても、double何も起こりません。

for (double d = 438; d < 1e7; d *= 10) {
    double location = d;
    location += 0.00000000001;
    System.out.println(location);
}

プリント

438.00000000001
4380.00000000001
43800.00000000001
438000.0
4380000.0
于 2012-06-13T14:46:05.387 に答える
1

丸め誤差またはアンダーフローが発生している可能性があります。任意精度でBigDecimalを使用してみます。

于 2012-06-13T14:47:36.873 に答える
1

http://firstclassthoughts.co.uk/java/traps/java_double_traps.htmlを読む必要があります

これは、Java が double と float を格納および処理する方法と、それらを使用および比較するときにそれらが何を意味するかについて説明します。

これは基本的に「あなたが見るものはあなたが得るものではない」というケースです。

大きな小数を使用することにした場合、これには独自のトラップのケースがあります

http://firstclassthoughts.co.uk/java/traps/big_decimal_traps.html

これは本当に 0.00000000001 を追加して何をしようとしているのか??

于 2012-06-13T14:53:34.727 に答える
0

別の回答に追加するもう1つのこと。問題は、値が小さすぎることではありません。値が大きい = 不運が大きい。例を参照してください。

 float x = 20000000.0f;
 for (int i = 0; i < 10000000; i++) {
     x += 1;
 }
 System.out.println(x); // prints 20000000.0f, not 30000000.0f!

したがって、ループで浮動小数点数を使用すると、このループを終了することはできません

于 2012-06-13T16:26:28.750 に答える