0

floatの値を毎回0.1ずつ増やしていきます。しかし、私はいつか非常に奇妙な結果を得ています。

float kmVal = 0.0f;    
EditText kms = (EditText) findViewById(R.id.km);
kmVal = Float.valueOf(kms.getText().toString()); 

ボタンをクリックすると、値が増加します。

kmVal += 0.1;
kms.setText(String.valueOf(kmVal));

ログ:-

06-24 13:16:21.644: I/System.out(958): Value ==0.1
06-24 13:16:21.644: I/System.out(958): String Value ==0.1
06-24 13:16:21.886: D/SntpClient(61): request time failed: java.net.SocketException: Address family not supported by protocol
06-24 13:16:22.145: I/System.out(958): Value ==0.2
06-24 13:16:22.145: I/System.out(958): String Value ==0.2
06-24 13:16:22.384: I/System.out(958): Value ==0.3
06-24 13:16:22.384: I/System.out(958): String Value ==0.3
06-24 13:16:22.484: I/System.out(958): Value ==0.4
06-24 13:16:22.484: I/System.out(958): String Value ==0.4
06-24 13:16:22.684: I/System.out(958): Value ==0.5
06-24 13:16:22.684: I/System.out(958): String Value ==0.5
06-24 13:16:22.868: I/System.out(958): Value ==0.6
06-24 13:16:22.874: I/System.out(958): String Value ==0.6
06-24 13:16:23.056: I/System.out(958): Value ==0.70000005
06-24 13:16:23.064: I/System.out(958): String Value ==0.70000005
06-24 13:16:23.884: I/System.out(958): Value ==0.8000001
06-24 13:16:23.884: I/System.out(958): String Value ==0.8000001
06-24 13:16:23.964: D/dalvikvm(353): GC_EXPLICIT freed 7K, 44% free 3532K/6279K, external 716K/1038K, paused 106ms
06-24 13:16:24.536: I/System.out(958): Value ==0.9000001
06-24 13:16:24.536: I/System.out(958): String Value ==0.9000001

ログからわかるように、0.6までの値は問題ありませんが、その後、不要な数字が追加されます。なぜこんな結果になるのかわかりません。誰かアイデアがあれば親切に助けてください。

ありがとう

4

2 に答える 2

5

これは、浮動型の数値がどのように表されるかによるものです。JLSから:

浮動小数点値セットの有限の非ゼロ値はすべて、s・m・2(e --N + 1)の形式で表すことができます。ここで、sは+1または-1であり、mは2N未満の正の整数です。 eは、Emin =-(2K-1-2)とEmax = 2K-1-1の間の整数であり、NとKは値セットに依存するパラメーターです。

したがって、float値は10進数の実数を正確に表すことはできません。あなたはイニシャルを取得するかもしれませんが、0.1実際に起こることはあなたが取得0.0999999999999999996していることであり、それはに変換され0.1ます。しかし、操作を続けると、精度が低下し続けます。

詳細については、これこれをお読みください。

正確に使用するにはBigDecimal

BigDecimal test = new BigDecimal("0.1");
test = test.add(new BigDecimal("0.1"));
System.out.println(test);
于 2012-06-24T08:20:40.453 に答える
0

浮動小数点値の正確な表現が本当に必要な場合は、実際、doubleまたはfloat他の言語のような単純な浮動小数点型を使用することはできません。Javaでは、を使用できますBigDecimal。しかし、私は最初に、この正確な浮動小数点が本当に必要かどうかを理解します。

于 2012-06-24T08:28:48.800 に答える