你們可能都遇到過,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
若是須要準確計算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; } }