我是靠谱客的博主 英俊黑猫,最近开发中收集的这篇文章主要介绍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*20.5   ......取整0
			0.5*21.0   ......取整1
			0.0*20
			所以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*20.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、解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部