2012-08-09 40 views
0

我想將我從數據庫中獲得的經度和緯度轉換爲字符串。字符串是正確的,當我嘗試將它轉換爲雙精度時,它也是正確的。然而,當我將雙精度值或字符串值(我已經嘗試過)轉換爲浮點值時,最後一個小數點會變成四捨五入。將字符串轉換爲浮動而不是圓整java

字符串的值或雙是59.858139 皈依浮動是59.85814

我用盡了一切,這是一個絕望的例子:)

private float ConvertToFloat(double d) 
{ 
    float f = 00.000000f; 
    f = (float) d; 
    return f; 
} 

回答

1

我們開始與你的十進制數59.858139

轉換,這個數字將二進制:111011.11011011101011101111111101011100011011000001000110100001000100...

即這個數字是二進制的無限分數。不可能完全表示它。 (以同樣的方式,這是不可能的十進制數來表示1/3完全一致)

重寫次數某種形式的二進制科學計數法:

10^101 * 1.1101111011011101011101111111101011100011011000001000110100001000100...

請記住,這仍是二進制,所以10^101對應於2^5十進制表示法。

現在...浮點值可以在尾數中存儲23位。如果我們舍它採用「輪最近的」舍入模式,我們得到:

10^101 * 1.11011110110111010111100

等於:

111011.110110111010111100

這是所有能融入精度浮點數據類型。現在轉換回十進制:

59.8581390380859375

似乎相當接近59.858139其實......但是,這僅僅是運氣。如果我們將第二接近的浮點值轉換爲二進制值,會發生什麼?

111011.110110111010111011 = 59.858135223388671875

所以基本上分辨率約爲0.000004

所以我們所能從float值中真正知道的是這個數字是這樣的:59.858139±可以是59.85813759.858141

由於最後一位數字相當不確定,我猜測打印代碼足夠聰明,可以理解最後一位數字不在浮點值的精度範圍內,因此該值四捨五入爲59.85814


順便說一句,如果你(像我是)都懶得用手二進制和十進制小數之間的轉換,你可以使用this converter。如果您想詳細瞭解浮點系統的詳細信息,the wikipedia page for floating point representation是一個很好的資源。

+0

請使用IEEE754,而不是二進制數學;)此外,這裏有這個http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Shark 2012-08-09 13:04:28

+0

@Shark目的不是要將十進制值轉換爲浮點表示。他的計劃已經做到了。問題的關鍵在於說明數字是二進制的無限分數,因此不可能精確表示,無論使用何種精度。 – Alderath 2012-08-09 13:14:44

7

你知道,雙打比浮點精度更高,浮點數更多,對嗎?這是預期的行爲。在這種情況下,將一個雙精度浮點數轉換爲浮點數是沒有意義的。

這裏的東西,讓你在正確的方向想......

Double.doubleToRawLongBits(long value); 
    Float.intBitsToFloat(int bits); 

雙打不適合轉換成int,他們必須適應長。它的尺寸真的是兩倍,即使用字符串調解位也不會有什麼好處。

+0

是的,但爲什麼當我從字符串轉換它的時候浮動四捨五入?它不應該是字符串的確切值嗎?雙轉換隻是我試過,因爲字符串轉換不起作用。 – hammerpath 2012-08-09 10:28:05

+1

浮點數爲32位,Double爲64位。該字符串是一串字符。 32位不足以表示你想要的(字符串)。 – Shark 2012-08-09 10:33:56

+0

看看這個線程,它涵蓋了浮動的精度損失http://stackoverflow.com/questions/11825719/precision-lost-in-float-value-using-java/11825865#11825865 – Shark 2012-08-09 10:38:28

3

float只有24位的精度,這將是不夠保存在你的緯度和經度位數。

2.舍入是由於數字的大小。因此,使用double,如果您需要浮點,或使用BigDecimal

+0

我會推薦BigDecimals,在這種情況下,雙打不能完成這項工作,就像漂浮物不在這裏一樣。 – Shark 2012-08-09 10:35:51

+0

@Shark多數民衆贊成在......這就是我在最後提到它的原因。 – 2012-08-09 10:40:10