【Java】Float計算不許確

你們可能都遇到過,float在計算某些值時,會有不許確的狀況。java

好比以下狀況:ide

 

> 計算不許確

package com.nicchagil.study.java.demo.No10float計算.No01不許確的舉例;

public class Call {

    public static void main(String[] args) {
        System.out.println(0.08f + 0.01f);
    }

}

 

打印:工具

0.089999996

 

> 用BigDecimal代替計算

若是須要準確計算float,一種方法就是用BigDecimal來進行計算,看如下工具類:spa

import java.math.BigDecimal;

public class FloatCalculator {

    /**
     * <p>add</p>
     * @param a
     * @param b
     * @return
     */
    public static float add(float a, float b) {
        
        BigDecimal b1 = new BigDecimal(a + "");
        BigDecimal b2 = new BigDecimal(b + "");
        float f = b1.add(b2).floatValue();
        
        return f;
        
    }
    
    /**
     * <p>subtract</p>
     * @param a
     * @param b
     * @return
     */
    public static float subtract(float a, float b) {
        
        BigDecimal b1 = new BigDecimal(a + "");
        BigDecimal b2 = new BigDecimal(b + "");
        float f = b1.subtract(b2).floatValue();
        
        return f;
        
    }
    
    /**
     * <p>multiply</p>
     * @param a
     * @param b
     * @return
     */
    public static float multiply(float a, float b) {
        
        BigDecimal b1 = new BigDecimal(a + "");
        BigDecimal b2 = new BigDecimal(b + "");
        float f = b1.multiply(b2).floatValue();
        
        return f;
        
    }
    
    /**
     * <p>divide</p>
     * <p>當不整除,出現無限循環小數時,向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向上舍入, 1.55保留一位小數結果爲1.6</p>
     * @param a
     * @param b
     * @return
     */
    public static float divide(float a, float b) {
        
        return divide(a, b, 2, BigDecimal.ROUND_HALF_UP);
        
    }
    
    /**
     * <p>divide</p>
     * @param a
     * @param b
     * @param scale
     * @param roundingMode
     * @return
     */
    public static float divide(float a, float b, int scale, int roundingMode) {
        
        /*
         * 經過BigDecimal的divide方法進行除法時就會拋異常的,異常以下:
         * java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)
         * 解決之道:就是給divide設置精確的小數點divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)
         * BigDecimal.ROUND_HALF_UP : 向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向上舍入, 1.55保留一位小數結果爲1.6
         */
        
        BigDecimal b1 = new BigDecimal(a + "");
        BigDecimal b2 = new BigDecimal(b + "");
        float f = b1.divide(b2, scale, roundingMode).floatValue();
        
        return f;
        
    }
    
}
相關文章
相關標籤/搜索