我是靠谱客的博主 英俊黑猫,最近开发中收集的这篇文章主要介绍double精度丢失总结1、double的结构2、double的存储原理3、精度丢失示例4、解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
1、double的结构
(1)双进度:1位符号位,11位指数,52位小数。
(2)%19.2lf:17位整数,2位小数,加小数点总长20.
2、double的存储原理
(1)数据在内存中是以二进制形式存储的;
(2)小数在存储时,小数部分采用乘2取整的方法进行计算。
例如:
○ 有穷尽数据:
0.125变成二进制为:
0.125*2=0.25 ......取整0
0.25*2=0.5 ......取整0
0.5*2= 1.0 ......取整1
0.0*2=0
所以0.125的二进制为0.001
○ 无穷尽数据:
0.9变成二进制为:
0.9*2=1.8.....取整1
0.8*2=1.6…....取整1
0.6*2=1.2.....取整1
0.2*2=0.4.....取整0
0.4*2=0.8 ...取整0
0.8*2=1.6 ....取整1
所以0.9的二进制为0.111001110011100。。。
它是一个循环,不可能出现小数部分为0的情况。
所以当你按照一定精度进行截取时,它在内存中表示时就会小于0.9,就会产生精度丢失。
3、精度丢失示例
public static void main(String[] args) {
double number1 = 1.1;
double number2 = 2.2;
double result = number1 + number2 ;
System.out.println("result: "+result);
}
result: 3.3000000000000003
4、解决方法
(1)优先使用decimal数据类型;
(2)若必须使用double,可先把double转换为字符串,再作为BigDecimal(String val)构造函数的参数,转换为BigDecimal对象之后再进行加减乘除操作。
//加
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();
}
//减
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();
}
//乘
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();
}
//除
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();
}
测试类
public static void main(String[] args) {
double result1 = add(1.1, 2.2);
System.out.println("处理后的double运算结果:" + result1);
}
使用BigDecimal运算结果:3.3
最后
以上就是英俊黑猫为你收集整理的double精度丢失总结1、double的结构2、double的存储原理3、精度丢失示例4、解决方法的全部内容,希望文章能够帮你解决double精度丢失总结1、double的结构2、double的存储原理3、精度丢失示例4、解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复