public class MathTest {
public class MathTest {
// 除法运算保留精度
private static final int DEF_DIV_SCALE = 10;
@Test
public void doCal() throws IllegalAccessException {
calculate(4.56, 7.015, 3);
/**
* 打印结果:
* 求和:11.575
* 相减:-2.455
* 相乘:21.045
* 除法:2.3383333333
* 11.57
* 11.58
* 11.58
*/
calculate(4.56, 7.115, 3);
/**
* 打印结果:
* 求和:11.675
* 相减:-2.555
* 相乘:21.345
* 除法:2.3716666667
* 11.68
* 11.68
* 11.68
*/
calculate(4.56, 7.0151, 3);
/**
* 打印结果:
* 求和:11.5751
* 相减:-2.4551
* 相乘:21.0453
* 除法:2.3383666667
* 11.58
* 11.58
* 11.58
*/
}
public void calculate(double x, double y, int a) throws IllegalAccessException {
// 求和
double sum = MathTest.add(x, y);
// 相减
double sub = MathTest.sub(x, y);
// 相乘
double mul = MathTest.mul(y, a);
// 除法
double div = MathTest.div(y, a);
System.out.println("求和:" + sum);
System.out.println("相减:" + sub);
System.out.println("相乘:" + mul);
System.out.println("除法:" + div);
/**
* 保留两位小数
*/
// 1.第一种方式
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(sum));
// 2.第二种方式
System.out.println(String.format("%.2f", sum));
// 3.第三种方式
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(0);
System.out.println(round(sum, 2));
}
/**
* 精确加法
*/
public static double add(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.add(b2).doubleValue();
}
/**
* 精确减法
*/
public static double sub(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.subtract(b2).doubleValue();
}
/**
* 精确乘法
*/
public static double mul(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.multiply(b2).doubleValue();
}
/**
* 精确除法 使用默认精度
*/
public static double div(double value1, double value2) throws IllegalAccessException {
return div(value1, value2, DEF_DIV_SCALE);
}
/**
* 精确除法
*
* @param scale
* 精度
*/
public static double div(double value1, double value2, int scale) throws IllegalAccessException {
if (scale < 0) {
throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
// return b1.divide(b2, scale).doubleValue();
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 四舍五入
*
* @param scale
* 小数点后保留几位
*/
public static double round(double v, int scale) throws IllegalAccessException {
return div(v, 1, scale);
}
}
java小数精确计算
最新推荐文章于 2024-05-16 15:54:10 发布