Java中如何解决double和float精度不准的问题
生活随笔
收集整理的這篇文章主要介紹了
Java中如何解决double和float精度不准的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道浮點數是無法在計算機中準確表示的,例如0.1在計算機中只是表示成了一個近似值,因此,對付點數的運算時結果具有不可預知性。
在進行數字運算時,如果有double或float類型的浮點數參與計算,偶爾會出現計算不準確的情況。如以下示例代碼:
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);}}上述代碼執行結果如下:
0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999在大多數情況下,使用double和float計算的結果是準確的,但是在一些精度要求很高的系統中,這種問題是非常嚴重的。
在《Effective Java》中提到一個原則,那就是float和double只能用來作科學計算或者是工程計算,但在商業計算中我們要用java.math.BigDecimal,通過使用BigDecimal類我們可以解決上述問題,實例代碼如下:
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.multiply(b2).doubleValue();}public static double div(double d1,double d2){return div(d1,d2,DEF_DIV_SCALE);}public static double div(double d1,double d2,int scale){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1=new BigDecimal(Double.toString(d1));BigDecimal b2=new BigDecimal(Double.toString(d2));return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();}}運行結果如下:
0.06 0.58 401.5 1.233詳細,請參考API文檔。
轉載于:https://www.cnblogs.com/zenghansen/p/3990311.html
總結
以上是生活随笔為你收集整理的Java中如何解决double和float精度不准的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1350 Taxi Cab Scheme
- 下一篇: 交换排序---冒泡排序算法(Javasc