在这个程序中遇到double运算精度的问题,首先贴出代码:
package Introduction; public class BankAccount { private double balance; public BankAccount(double openingBalance){ balance = openingBalance; } public void deposit(double amount){ balance = balance+amount; } public void withdraw(double amount){ balance = balance - amount; } public void display(){ System.out.println("balance = "+balance); } } package Introduction; public class BankAccountApp { public static void main(String[] args) { BankAccount ba = new BankAccount(100.00); System.out.println("Before transtions:"); ba.display(); ba.deposit(500.32); System.out.println("After deposit:"); ba.display(); ba.withdraw(62.322); System.out.println("After withdraw:"); ba.display(); } } 运行结果: Before transtions: balance = 100.0 After deposit: balance = 600.3199999999999 //这里double类型的加法,产生了精度缺失 After withdraw: balance = 537.9979999999999 //这里double类型的减法,产生了精度缺失下面对double精度缺失问题进行分析:
使用BigDecimal来解决double精度问题,使用BigDecimal并且一定要用String来够造,先将两个浮点数转为String,然后构造成BigDecimal,在其中一个上调用add方法,传入另 一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。
package Introduction; import java.math.BigDecimal; public class DoubleAccuracy { /** * 对double数据进行取精度 * @param value double数据 * @param scale 精度位数(保留的小数位数) * @param roundingMode 精度取值方式 * @return 精度计算后的数据 * @author kevinelstri */ public static double round(double value,int scale,int roundingMode){ BigDecimal bd = new BigDecimal(value); bd = bd.setScale(scale, roundingMode); double d = bd.doubleValue(); bd = null; return d; } /* * double 相加 * */ public static double sum(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.add(bd2).doubleValue(); } /* * double 相减 * */ public static double sub(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.subtract(bd2).doubleValue(); } /* * double 乘法 * */ public static double mul(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.multiply(bd2).doubleValue(); } /* * double 除法 * scale 四舍五入 小数点位数 * */ public static double div(double d1,double d2,int scale){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.divide(bd2,scale,BigDecimal.ROUND_HALF_DOWN).doubleValue(); } public static void main(String[] args) { System.out.println("double精度:"); double value = 63723.43243; int scale = 3; int roundingMode = 6; double d = round(value,scale,roundingMode); System.out.println(d); System.out.println("--------------------------"); System.out.println("double相加:"); double d1 = 37284.324; double d2 = 3627432.342432; double sum = sum(d1,d2); System.out.println(sum); System.out.println("--------------------------"); System.out.println("double相减:"); double sub = sub(d2,d1); System.out.println(sub); System.out.println("--------------------------"); System.out.println("double相乘:"); double mul = mul(d2,d1); System.out.println(mul); System.out.println("--------------------------"); System.out.println("double相除:"); double div = div(d2,d1,3); System.out.println(div); System.out.println("--------------------------"); } }