double类型数据做加和操作时会丢失精度问题处理
2017-02-04 19:09
639 查看
double类型的数据做加和操作 时会丢失精度,如下操作结果为:
int a = 3;
double b = 0.03;
double c = 0.03;
double d = a + b + c;
System.out.println("first d:" + d);
结果:first d:3.0599999999999996
如果用java.math包中的BigDecima类并用String来构造加和操作则结果会保持正确。操作如下:
public class TestBigDecimalDemo {
/**
* 测试BigDecimal 在进行算数计算时不会丢失精度。--一般的数值类型在进行 金融类数据计算时会丢失精度。
* @param args
*/
public static void main(String[] args) {
// double result = add(1.00000000000000001, 1.00000000000000001);
// //result = 2.0 丢失了精度
// System.out.println(result);
int a = 3;
double b = 0.03;
double c = 0.03;
//不会丢失精度
double d = add(add(a, b),c);
System.out.println("first d:" + d);
//会丢失精度
d = a+b+c;
System.out.println("second d:" + d);
}
/**
* 加法运算
* @param m1
* @param m2
* @return
*/
public static double add(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.add(p2).doubleValue();
}
/**
* 减法运算
* @param m1
* @param m2
* @return
*/
public static double sub(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.subtract(p2).doubleValue();
}
/**
* 乘法运算
* @param m1
* @param m2
* @return
*/
public static double mul(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.multiply(p2).doubleValue();
}
/**
* 除法运算
* @param m1
* @param m2
* @param scale
* @return
*/
public static double div(double m1, double m2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("Parameter error");
}
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
输出结果为:3.06
int a = 3;
double b = 0.03;
double c = 0.03;
double d = a + b + c;
System.out.println("first d:" + d);
结果:first d:3.0599999999999996
如果用java.math包中的BigDecima类并用String来构造加和操作则结果会保持正确。操作如下:
public class TestBigDecimalDemo {
/**
* 测试BigDecimal 在进行算数计算时不会丢失精度。--一般的数值类型在进行 金融类数据计算时会丢失精度。
* @param args
*/
public static void main(String[] args) {
// double result = add(1.00000000000000001, 1.00000000000000001);
// //result = 2.0 丢失了精度
// System.out.println(result);
int a = 3;
double b = 0.03;
double c = 0.03;
//不会丢失精度
double d = add(add(a, b),c);
System.out.println("first d:" + d);
//会丢失精度
d = a+b+c;
System.out.println("second d:" + d);
}
/**
* 加法运算
* @param m1
* @param m2
* @return
*/
public static double add(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.add(p2).doubleValue();
}
/**
* 减法运算
* @param m1
* @param m2
* @return
*/
public static double sub(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.subtract(p2).doubleValue();
}
/**
* 乘法运算
* @param m1
* @param m2
* @return
*/
public static double mul(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.multiply(p2).doubleValue();
}
/**
* 除法运算
* @param m1
* @param m2
* @param scale
* @return
*/
public static double div(double m1, double m2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("Parameter error");
}
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
输出结果为:3.06
相关文章推荐
- Spring boot处理Long类型的Json数据,在Js代码调用时精度丢失的问题
- struts2标签处理double数据类型 精度缺失问题
- java中double类型数据加减操作精度丢失问题及解决方法
- double数据类型运算精度丢失问题
- java中double、float类型计算精度丢失问题
- 关于 double类型乘以100精度丢失的奇怪问题?
- C++、C中有关double、float类型转换成int型,及取整,丢失精度问题。
- Spring boot处理Long类型的Json数据,前端调用精度丢失
- double类型转int类型,精度丢失的问题
- java中Double类型的运算精度丢失的问题
- 解决double类型运算时精度丢失问题
- Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)
- JAVA基本数据类型范围和float、double精度问题
- Java中double类型精度丢失问题
- float及double类型减法运算时精度丢失问题
- 图像处理中像素点的问题:double、long、unsigned、int、char类型数据所占字节数
- [置顶] double、float类型进行运算造成精度丢失的问题解决
- [ JAVA编程 ] double类型计算精度丢失问题及解决方法
- 关于java中long类型的数据转换json传到前台时丢失精度问题的解决办法
- Java中double数据类型计算会损失精度问题