参考答案
在double、float类型之间做计算,经常会出现精度丢失的情况。
使用BigDecimal里的String构造器进行计算,就不会出现精度丢失的情况了。
实例:
/** * 提供精确加法计算的add方法 * * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */ public static double add(double value1, double value2) { BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.add(b2).doubleValue(); } /** * 提供精确减法运算的sub方法 * * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */ public static double sub(double value1, double value2) { BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确乘法运算的mul方法 * * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */ public static double mul(double value1, double value2) { BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算方法div * * @param value1 被除数 * @param value2 除数 * @param scale 精确范围 * @return 两个参数的商 * @throws IllegalAccessException */ public static double div(double value1, double value2, int scale) throws IllegalAccessException { // 如果精确范围小于0,抛出异常信息 if (scale < 0) { throw new IllegalAccessException("精确度不能小于0"); } BigDecimal b1 = new BigDecimal(Double.valueOf(value1)); BigDecimal b2 = new BigDecimal(Double.valueOf(value2)); return b1.divide(b2, scale).doubleValue(); } /** * 四舍五入保留两位小数 * @param f * @return */ public static double fixedNumber(double f) { BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return f1; } }
以上,是Java面试题【 Java中如何避免数字(金额)精度丢失】的参考答案。
输出,是最好的学习方法。
立即行动,在评论区记录下你的问题、笔记或补充~
—end—