程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中浮點數精度成績的處理辦法

Java中浮點數精度成績的處理辦法

編輯:關於JAVA

Java中浮點數精度成績的處理辦法。本站提示廣大學習愛好者:(Java中浮點數精度成績的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中浮點數精度成績的處理辦法正文


成績描寫

在項目頂用Java做浮點數盤算時,發明關於4.015*100如許的盤算,成果不是預感中的401.5,而是401.49999999999994。如斯長的位數,關於顯示來講很不友愛。

成績緣由:浮點數表現

查閱相干材料,發明緣由是:盤算機中的浮點數其實不能完整准確表現。例如,關於一個double型的38414.4來講,盤算機是如許存儲它的:

轉成二進制:1001011000001110.0110011001100110011001100110011001100
轉成科

學計數法:1.0010110000011100110011001100110011001100110011001100×2^15

double型編碼格局是如許的:

double 符號位1位 階碼11位 尾數52位

符號位:負數同一是0

階碼:15是負數,是以最高位是1,最低位減1,為10000001110

尾數:去失落最高位默許的1,為0010110000011100110011001100110011001100110011001100

組合起來,終究獲得的編碼是:0 10000001110 0010110000011100110011001100110011001100110011001100

從這裡可以看出來,重要緣由在於二進制編碼使得小數部門沒法完整准確表現,例如0.4 = 0.25 + 0.125 + ...,只能無窮接近。所以在對浮點數做盤算時會發生精度誤差。

處理方法:高精度

Java中的BigDecimal可以支撐隨意率性精度的浮點數運算。在《Effective Java 》這本書中建議:float 和double 用來做迷信盤算或許是工程盤算,而在貿易盤算中應用java.math.BigDecimal 。

BigDecimal有多種結構辦法,如BigDecimal(double),BigDecimal(String),須要留意的是:結構參數為String類型時能力包管不喪失精度,由於double類型自己就是不完整准確的。故須要寫成如許:BigDecimal("0.02")。

double類型的根本運算都能在BigDecimal中找到絕對應的辦法。別的,BigDecimal還可以合營NumberFormat做格局化輸入。

BigDecimal在做運算的時刻都邑生成新的BigDecimal對象,是以絕對double來講會帶來更多的機能開支。

高精度完成初探

那末BigDecimal是若何做到可以或許表現隨意率性精度的呢?這裡只做一個初步的剖析。

起首看BigInteger的完成。通俗的int型是32位,是以有規模限制。BigInteger中有成員變量int[] mag,如許變長的int數組使得表現隨意率性年夜小的整數成為能夠。

再看BigDecimal的完成。它的官方引見中說,隨意率性一個BigDecimal都可以表現為unscaledValue × 10^-scale的情勢。unscaledValue是一個隨意率性年夜小的整數,在源代碼中對應BigInteger intVal這個成員變量;scale是階數,在源代碼中對應int scale這個變量。如許就在BigInteger的基本上獲得了BigDecimal的完成。

以上所述是小編給年夜家引見的Java中浮點數精度成績的處理辦法,願望對年夜家有所贊助,假如年夜家有任何疑問迎接給我留言。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved