2012-06-24 43 views
0

我想每次增加0.1的浮動值。但是我有時候會變得很奇怪。問題與浮動增量在Android中

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)); 

LOG: -

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的值是確定,但之後其加入額外的數字,我不希望看到的。我不知道爲什麼我會得到這樣的結果。如果有人有任何想法,請提供幫助。

謝謝

+0

這不是特定於Android,甚至Java。 –

回答

4

這是因爲如何表示浮點型數字。從JLS

任何浮點值集的有限的非零值都可以在形式S·米表示·圖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。但是當你繼續對它進行操作時,它會一直失去精確度。

閱讀thisthis瞭解更多信息。

對於精密使用BigDecimal

BigDecimal test = new BigDecimal("0.1"); 
test = test.add(new BigDecimal("0.1")); 
System.out.println(test); 
+0

非常感謝您的回答。 – Scorpion

0

如果你真的需要浮點值的精確表示,那麼你的確不能用簡單的浮點類型就像在任何語言doublefloat。在Java中,您可以使用BigDecimal。但是,我首先要弄清楚你是否真的需要這個確切的浮點數。

+0

是的,我需要這個確切的浮點數。 – Scorpion

+0

您能否在此幫助我。我怎樣才能得到確切的浮點數。 – Scorpion

+1

請首先閱讀'java.math.BigDecimal'的javadoc。以BigDecimal kmVal = new BigDecimal(kms.getText()。toString())開頭;'' –