国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中如何解決double和float精度不準的問題

2019-11-06 06:09:09
字體:
來源:轉載
供稿:網友

我們知道浮點數是無法在計算機中準確表示的,例如0.1在計算機中只是表示成了一個近似值,因此,對付點數的運算時結果具有不可預知性。

在進行數字運算時,如果有double或float類型的浮點數參與計算,偶爾會出現計算不準確的情況。如以下示例代碼:

[java] view plain copy PRint?在CODE上查看代碼片package ex;    public class BigDeciTest {      public static void main(String[] args){          System.out.println(0.05+0.01);          System.out.println(1.0-0.42);          System.out.println(4.015*100);          System.out.println(123.3/100);                }    }  上述代碼執行結果如下:

[plain] view%20plain copy print?0.060000000000000005  0.5800000000000001  401.49999999999994  1.2329999999999999  在大多數情況下,使用double和float計算的結果是準確的,但是在一些精度要求很高的系統中,這種問題是非常嚴重的。

在《Effective Java》中提到一個原則,那就是float和double只能用來作科學計算或者是工程計算,但在商業計算中我們要用java.math.BigDecimal,通過使用BigDecimal類我們可以解決上述問題,實例代碼如下:

[java] view%20plain copy print?package ex;    import java.math.*;    public class BigDecimalDemo {      public static void main(String[] args){          System.out.println(ArithUtil.add(0.01, 0.05));          System.out.println(ArithUtil.sub(1.0, 0.42));          System.out.println(ArithUtil.mul(4.015, 100));          System.out.println(ArithUtil.div(123.3, 100));      }  }    class ArithUtil{      private static final int DEF_DIV_SCALE=10;            private ArithUtil(){}            public static double add(double d1,double d2){          BigDecimal b1=new BigDecimal(Double.toString(d1));          BigDecimal b2=new BigDecimal(Double.toString(d2));          return b1.add(b2).doubleValue();                }            public static double sub(double d1,double d2){          BigDecimal b1=new BigDecimal(Double.toString(d1));          BigDecimal b2=new BigDecimal(Double.toString(d2));          return b1.subtract(b2).doubleValue();                }            public static double mul(double d1,double d2){          BigDecimal b1=new BigDecimal(Double.toString(d1));          BigDecimal b2=new BigDecimal(Double.toString(d2));          return b1.mult派生到我的代碼片0.06  0.58  401.5  1.233  詳細,請參考API文檔
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙里县| 珠海市| 黑河市| 喀喇沁旗| 西昌市| 丘北县| 克山县| 启东市| 涡阳县| 双城市| 石楼县| 南投市| 灵川县| 津市市| 乾安县| 娄底市| 浦县| 嘉定区| 柏乡县| 洮南市| 察雅县| 黑河市| 平果县| 平邑县| 宾阳县| 甘洛县| 肃北| 龙陵县| 鸡西市| 阿尔山市| 涿鹿县| 乌拉特后旗| 历史| 南汇区| 靖宇县| 湘乡市| 新乡市| 兴宁市| 平和县| 乌鲁木齐市| 宁武县|