问题:
public class testUtil {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(0.05+0.044);
System.out.println(0.05-0.04);
System.out.println(0.05*0.042);
System.out.println(0.05/0.042);
}
}
运行结果:
0.094
0.010000000000000002
0.0021000000000000003
1.1904761904761905
解决代码:
import java.math.BigDecimal;
public class ArithUtil {
// 这个类不能实例化
private ArithUtil(){
}
/**
* 加法运算
* @param a 被加数
* @param b 加数
* @return 两个参数的和
*/
public static double add(double a, double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.add(b2).doubleValue();
}
/**
* 减法运算
* @param a 被减数
* @param b 减数
* @return 两个减数的差
*/
public static double sub(double a, double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.subtract(b2).doubleValue();
}
/**
* 乘法运算
* @param a 被乘数
* @param b 乘数
* @return 两个参数的积
*/
public static double mul(double a, double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.multiply(b2).doubleValue();
}
/**
* 除法运算
* @param a 被除数
* @param b 除数
* @param scale 精度
* @return 两个参数的商
*/
public static double div(double a, double b, int scale){
if(scale < 0){
throw new IllegalArgumentException("The scale must be a positive integer or zero!!!");
}
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 精度为10的除法运算
* @param a 被除数
* @param b 除数
* @return 两个参数的商
*/
public static double div(double a, double b){
return div(a, b, 10);
}
}
demo:
<span style="color:#000000;"> public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ArithUtil.add(0.05, 0.044));
System.out.println(ArithUtil.sub(0.05, 0.04));
System.out.println(ArithUtil.mul(0.05, 0.042));
System.out.println(ArithUtil.div(0.05, 0.042));
}</span>
运行结果:
0.094
0.01
0.0021
1.1904761905
note:
优先推荐 BigDecimal(String val)构造方法。
理由: BigDecimal(double val) 中的double假设为0.1 但是实际上它有可能是0.100000000000000000000005555。而 BigDecimal(String val) 中"0.1"即为0.1。
本文内容由 梁健全 人民邮电出版社 你必须知道的261个问题JAVA语言问题