2013-05-18 29 views
1

我想知道如何圓一個浮點數的機器浮點數(例如)。 數字「0.01111116」不能由機浮點表示,在一些舍入模式中,該數量應該表示爲「0.011111159999999995」與一些精度損失。 但我不知道如何在Java中完成這個? 所以我想知道API來設置舍入模式以獲得Java中機器浮點數的確切表示。 謝謝!有沒有辦法在Java中設置浮點單元的舍入模式?

+0

請澄清這正是你想要做的事。 –

+2

就像C語言中的函數「fesetround」。 – gingeredder

回答

0

如果你在談論你的程序的源代碼中的字面0.01111116,Java編譯器轉換到這一點在編譯時二進制浮點表示。

如果你正在談論(比方說)含有字符「0.01111116」的字符串,是被轉換爲二進制浮點表示,如果/當你調用(例如Double.parseDouble(...)

無論哪種方式,轉換會在幕後,你沒有對實際的舍入任何控制。但從某種意義上說它是沒有意義的。表達式的本質是一些固有的舍入,其結果通常是從數學的角度來看「最準確的」。

如果您確實希望轉換使用不同的舍入/截斷規則,您可以在事後(例如舍入或截斷轉換後的值)執行此操作,也可以將自己的字符串實現爲浮點轉換方法。

您將無法改變,Java編譯器將文字轉換的方式。它是語言規範的一部分。

+0

我擔心的問題是有兩個浮點變量d1和d2; (例如d1 = 0.1; d2 = 0.2);在數學語義中d1 + d2應該等於0.3。但是在浮點語義中,舍入模式存在,0.3不能用浮點型精確表示。所以結果接近0.3,但結果可能是0.2999 *** ...或0.3000 *** ...;所以我想知道如何設置舍入模式或如何獲得具體舍入方向的結果。 – gingeredder

+0

@gingeredder - 沒有使用浮點的解決方案。如果您需要精確控制舍入,請不要使用浮點數。用'BigDecimal'做你的算術,不要轉換爲'float'或'double'。 'BigDecimal'確實給了你更多的舍入等控制權,但更重要的是它是基於10的,所以任何有限十進制表示的數字(即沒有重複出現的部分)都可以精確地表示。 –

0

嘗試公地MATH3精密http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html

double d = 0.1 + 0.2; 
    System.out.println(d); 
    d = Precision.round(d, 1); <-- 1 decimal place 
    System.out.println(d); 

輸出

0.30000000000000004 
0.3 
+1

在C語言中,有一個函數「fesetround」來設置當前舍入模式。在Java中,我想要做類似的事情。所以我想知道java中的類似函數來設置當前的舍入方向。 – gingeredder

+0

我擔心的問題是有兩個浮點變量d1和d2; (例如d1 = 0.1; d2 = 0.2);在數學語義中d1 + d2應該等於0.3。但是在浮點語義中,舍入模式存在,0.3不能用浮點類型精確表示。所以結果接近0.3,但結果可能是0.2999 *** ...或0.3000 *** ...;所以我想知道如何設置舍入模式或如何獲得具體的舍入方向的結果 – gingeredder

+0

好的,明白了你的觀點,看看更新 –

4

Java specification不提供任何手段來控制浮點舍入模式。使用舍入到最近的值。

它一般是不可能爲浮點運算產生數學精確的結果安排,因此軟件的設計必須容忍和糾正錯誤,或者在非常特殊的情況下,通過使用額外的照顧來獲得精確的結果。

相關問題