一、前言
在商业计算等用例场景下,通常使用BigDecimal来进行高精度运算,而在科学或工程计算等情况下通常用float或double来进行,也就是说java的lang包下提供的常用如float、double等在高精度场景下还不能完全满足需求,所以java在math包目录下定义了BigDecimal、BigInteger等来修复这些缺陷问题。
二、代码示例
1.double或float精度问题,分别通过加、减、乘、除运行举例说明,具体如下:
public static void main(String[] args) {@b@ @b@ System.out.println(0.06+0.01);@b@ @b@ System.out.println(1.0-0.32);@b@ @b@ System.out.println(100*1.015);@b@ @b@ System.out.println(123.1/100);@b@ @b@ }
运算打印结果如下:
0.06999999999999999@b@0.6799999999999999@b@101.49999999999999@b@1.2309999999999999
2.先定义高进度运行工具类,封装引用BigDecimal实现加、减、乘、除运行,从而解决上面问题,具体如下:
import java.math.BigDecimal;@b@@b@public class MathUtil {@b@ @b@ /**设置除法默认精度值*/@b@ private static int div_scale_val=12;@b@@b@ private MathUtil() {@b@ }@b@@b@ /** 加法运算 */@b@ public static double add(double d1, double d2) {@b@ BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@ BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@ return b1.add(b2).doubleValue();@b@ }@b@@b@ /** 减法运算 */@b@ public static double sub(double d1, double d2) {@b@ BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@ BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@ return b1.subtract(b2).doubleValue();@b@ }@b@ @b@ /** 乘法运算 */@b@ public static double mul(double d1, double d2) {@b@ BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@ BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@ return b1.multiply(b2).doubleValue();@b@ }@b@ @b@ /** 除法运算 */@b@ public static double div(double d1, double d2) {@b@ BigDecimal b1 = new BigDecimal(Double.toString(d1));@b@ BigDecimal b2 = new BigDecimal(Double.toString(d2));@b@ return b1.divide(b2,div_scale_val,BigDecimal.ROUND_HALF_UP).doubleValue();@b@ }@b@@b@}
测试代码如下:
public static void main(String[] args) {@b@ @b@ System.out.println(MathUtil.add(0.06,0.01));@b@ @b@ System.out.println(MathUtil.sub(1.0, 0.32));@b@ @b@ System.out.println(MathUtil.mul(100, 1.015));@b@ @b@ System.out.println(MathUtil.div(123.1,100));@b@ @b@}
运行打印结果如下:
0.07@b@0.68@b@101.5@b@1.231