float計算不準確的替代方法

Nick-Huang發表於2014-06-11

做報表的時候,有時候會遇到float的運算,偶爾會發生計算值不準確的情況。《Effective Java》中提到,float用於工程計算的運算。

如果需要準確計算float,一種方法就是用BigDecimal來進行計算,以下是一些工具方法。



import java.math.BigDecimal;

public class FloatCalculator {

	/**
	 * 

add

* @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; } /** *

subtract

* @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; } /** *

multiply

* @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; } /** *

divide

*

當不整除,出現無限迴圈小數時,向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數結果為1.6

* @param a * @param b * @return */ public static float divide(float a, float b) { return divide(a, b, 2, BigDecimal.ROUND_HALF_UP); } /** *

divide

* @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; } }


相關文章