我想知道如何圓一個浮點數的機器浮點數(例如雙)。 數字「0.01111116」不能由機浮點表示,在一些舍入模式中,該數量應該表示爲「0.011111159999999995」與一些精度損失。 但我不知道如何在Java中完成這個? 所以我想知道API來設置舍入模式以獲得Java中機器浮點數的確切表示。 謝謝!有沒有辦法在Java中設置浮點單元的舍入模式?
回答
如果你在談論你的程序的源代碼中的字面0.01111116
,Java編譯器轉換到這一點在編譯時二進制浮點表示。
如果你正在談論(比方說)含有字符「0.01111116」的字符串,是被轉換爲二進制浮點表示,如果/當你調用(例如)Double.parseDouble(...)
。
無論哪種方式,轉換會在幕後,你沒有對實際的舍入任何控制。但從某種意義上說它是沒有意義的。表達式的本質是一些固有的舍入,其結果通常是從數學的角度來看「最準確的」。
如果您確實希望轉換使用不同的舍入/截斷規則,您可以在事後(例如舍入或截斷轉換後的值)執行此操作,也可以將自己的字符串實現爲浮點轉換方法。
您將無法改變,Java編譯器將文字轉換的方式。它是語言規範的一部分。
我擔心的問題是有兩個浮點變量d1和d2; (例如d1 = 0.1; d2 = 0.2);在數學語義中d1 + d2應該等於0.3。但是在浮點語義中,舍入模式存在,0.3不能用浮點型精確表示。所以結果接近0.3,但結果可能是0.2999 *** ...或0.3000 *** ...;所以我想知道如何設置舍入模式或如何獲得具體舍入方向的結果。 – gingeredder
@gingeredder - 沒有使用浮點的解決方案。如果您需要精確控制舍入,請不要使用浮點數。用'BigDecimal'做你的算術,不要轉換爲'float'或'double'。 'BigDecimal'確實給了你更多的舍入等控制權,但更重要的是它是基於10的,所以任何有限十進制表示的數字(即沒有重複出現的部分)都可以精確地表示。 –
嘗試公地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
在C語言中,有一個函數「fesetround」來設置當前舍入模式。在Java中,我想要做類似的事情。所以我想知道java中的類似函數來設置當前的舍入方向。 – gingeredder
我擔心的問題是有兩個浮點變量d1和d2; (例如d1 = 0.1; d2 = 0.2);在數學語義中d1 + d2應該等於0.3。但是在浮點語義中,舍入模式存在,0.3不能用浮點類型精確表示。所以結果接近0.3,但結果可能是0.2999 *** ...或0.3000 *** ...;所以我想知道如何設置舍入模式或如何獲得具體的舍入方向的結果 – gingeredder
好的,明白了你的觀點,看看更新 –
的Java specification不提供任何手段來控制浮點舍入模式。使用舍入到最近的值。
它一般是不可能爲浮點運算產生數學精確的結果安排,因此軟件的設計必須容忍和糾正錯誤,或者在非常特殊的情況下,通過使用額外的照顧來獲得精確的結果。
- 1. 有沒有辦法在單元格中搜索模式?
- 2. 四捨五入C中沒有內置函數的浮點值
- 3. 有沒有辦法單獨設置WinForms ListView單元格的BackColor?
- 4. 有沒有辦法在C#中將數據庫設置爲單用戶模式?
- 5. 有沒有辦法在Java中設置變量的邊界?
- 6. 有沒有辦法從didSelectRowAtIndexPath設置單元格內容和imagaView?
- 7. 有沒有辦法將stdout設置爲二進制模式?
- 8. 有沒有辦法在嵌入式jetty中以編程方式設置context-params?
- 9. 有沒有辦法在java中創建xsd模式?
- 10. 有沒有辦法在MigLayout中插入「單元格」?
- 11. 有沒有辦法在matlab中的單元模式下調用子功能?
- 12. 沒有內置方法的舍入
- 13. 有沒有辦法防止舍入在opencv矩陣divison
- 14. 有沒有辦法在unordered_map的特定位置插入元素?
- 15. 有沒有辦法來設置的LotusScript
- 16. 在C++中使用不同的IEEE浮點舍入模式
- 17. 有沒有辦法在JLabel上設置錨點?
- 18. 數組元素設置切入點。有沒有解決方法?
- 19. 有沒有辦法在某個單元上放置按鈕?
- 20. 有沒有辦法在Windows Mobile設備上啓用FIPS模式?
- 21. 有沒有辦法來設置開發
- 22. 有沒有辦法設置HttpResponse?
- 23. 有沒有辦法爲RadioGroup設置BackgroundColor?
- 24. 有沒有辦法恢復VS2010設置?
- 25. 有沒有辦法在全局上設置DateTime.ToString()格式?
- 26. 有沒有辦法將Keyboard.FocusedElement設置爲特定的元素?
- 27. 有沒有辦法用一個「模式」
- 28. 有沒有辦法防止stringWithFormat四捨五入?
- 29. 有沒有辦法在DataSource配置中設置時區爲UTC
- 30. 有沒有辦法在WebStorm中設置項目級配置?
請澄清這正是你想要做的事。 –
就像C語言中的函數「fesetround」。 – gingeredder