2013-08-31 32 views
0

我在java中使用浮點數,打印它們並將它們存儲在MySQL浮點列中。其結果是,在Java打印示出如下 X = 260.1201 Y = 260.12Java與MySQL:浮點類型差異

它的確定,因爲X = Y + 0.0001 當我嘗試在拖車浮動列這些值存儲在MySQL i的值可以讀取內它是 x = 260.12 y = 260.12

爲什麼這種差異?不是java的float和MySQL的float是一樣的嗎?

只是另一個問題:在哪個更大的值,我可以期望與Java浮點數正確工作的精度爲0.0001?

回答

3

您正在推動浮點精度的32位IEEE 754 Wikipedia的限制。它有大約24位的精度。通常的經驗法則是,可用的最小增量值大約是您正在增加的數值的1/10 ** 7。

261.1200和261.1201是以相同的值存儲在FLOAT中的精度水平。這個SQL小提琴演示了這一事實。 http://sqlfiddle.com/#!2/2a521/2/0

全部floatdouble數字是近似值。

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

http://introcs.cs.princeton.edu/java/91float/

這是從來沒有一個驚喜,當兩個浮點值不==彼此相等的,即使你認爲他們應該的。當他們是時,它總是令人驚訝。

+0

是的,我推動他們,因爲我面臨的數字不應該包括在項目中。我仍然不需要全面的精確度,但是我想事先知道問題的嚴重程度......無論如何,標準是一樣的,我真的無法理解這種差異。你說這很正常,但是什麼原因? – mark

+0

看我的編輯,和這個sqlfiddle。 http://sqlfiddle.com/#!2/2a521/2/0有關這裏發生了什麼的解釋,請閱讀我引用的princeton參考。 –

1

我知道這是非常古老的討論主線,但今天我解決了同樣的問題,並想與大家分享。

在數據庫端柱的一個是浮動,我用

call = (CallableStatement)this.getStatement(); 
call.setFloat(floatData) 

發送浮點數據,但是,當我試圖挽救一些浮點值,然後正確的數據不會保存在數據庫中,不知怎麼就得到了轉換成不同的十進制值。

SOLUTION:

然後,我轉換成floatData價值dobule並呼籲

call.setDouble(doubledata) 

即使在數據庫列是float類型。

現在它工作正常。