1、double的结构
(1)双进度:1位符号位,11位指数,52位小数。
(2)%19.2lf:17位整数,2位小数,加小数点总长20.
2、double的存储原理
(1)数据在内存中是以二进制形式存储的;
(2)小数在存储时,小数部分采用乘2取整的方法进行计算。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20例如: ○ 有穷尽数据: 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、精度丢失示例
复制代码
1
2
3
4
5
6
7
8public 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对象之后再进行加减乘除操作。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31//加 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(); }
测试类
复制代码
1
2
3
4
5
6public 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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复