首页 > 其他分享 >BigDecimal为什么能保证精度不丢失?

BigDecimal为什么能保证精度不丢失?

时间:2024-06-08 18:32:44浏览次数:17  
标签:BigDecimal System 丢失 println new 精度 out

先说说为什么会丢精度。

public static void main(String[] args) {
        //正常 3.3
        System.out.println("加法结果:"+(1.1+2.2));
        //正常 -7.9
        System.out.println("减法结果:"+(2.2-10.1));
        //正常 2.42
        System.out.println("乘法结果:"+(1.1*2.2));
        //正常 0.44
        System.out.println("除法结果:"+(4.4/10));
}

结果:

为什么会丢失精度?

在于我们的计算机是二进制的。十进制小数没有办法是用二进制进行精确表示

浮点数的值实际上是由一个特定的数学公式计算得到的。

// 0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,
// 在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
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.6 * 2 = 1.2 -> 1
...

所以二进制表示为:0.001100110011001100110011001100110011001100110011001101...

循环根为:0011

但是十进制的整数转换为二进制没有问题,那么把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息,这就是BigDecimal的做法。

BigDecimal

scale表示精度信息,intCompact表示整数信息。

因此,BigDecimal 表示的数值是 (intCompact × 10-scale)。

四种构造函数

BigDecimal(int)     //创建一个具有参数所指定整数值的对象。
BigDecimal(double)  //创建一个具有参数所指定双精度值的对象。
BigDecimal(long)    //创建一个具有参数所指定长整数值的对象。
BigDecimal(String)  //创建一个具有参数所指定以字符串表示的数值的对象。

这几个都是常用的构造器,他们返回的对象都是BigDecimal对象。换而言之,将BigDecimal对象转换为其他类型的对象,我们通过以下几种。

toString()          //将BigDecimal对象的数值转换成字符串。
doubleValue()       //将BigDecimal对象中的值以双精度数返回。
floatValue()        //将BigDecimal对象中的值以单精度数返回。
longValue()         //将BigDecimal对象中的值以长整数返回。
intValue()          //将BigDecimal对象中的值以整数返回。

这里需要非常注意BigDecimal(double)的构造函数,也是会存在精度丢失的问题。

public static void main(String[] args) {
        BigDecimal intDecimal = new BigDecimal(10);
        BigDecimal doubleDecimal = new BigDecimal(4.3);
        BigDecimal longDecimal = new BigDecimal(10L);
        BigDecimal stringDecimal = new BigDecimal("4.3");
        System.out.println("intDecimal=" + intDecimal);
        System.out.println("doubleDecimal=" + doubleDecimal);
        System.out.println("longDecimal=" + longDecimal);
        System.out.println("stringDecimal=" + stringDecimal);
}

结果:

 所以创建BigDecimal一定要使用下面两种方式:

1、new BigDecimal(String)
2、BigDecimal.valueOf(double)

BigDecimal 等值比较问题

《阿里巴巴 Java 开发手册》中提到:

BigDecimal 使用 equals() 方法进行等值比较出现问题的代码示例:

BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("1.0");
System.out.println(a.equals(b));//false

这是因为 equals() 方法不仅仅会比较值的大小(value)还会比较精度(scale),而 compareTo() 方法比较的时候会忽略精度。

1.0 的 scale 是 1,1 的 scale 是 0,因此 a.equals(b) 的结果是 false。

 

 

 

标签:BigDecimal,System,丢失,println,new,精度,out
From: https://www.cnblogs.com/zhengbiyu/p/18238844

相关文章

  • Java的BigDecimal与数据库的Decimal的应用
    数据库方面Decimal的语法DECIMAL(M,D)M:总位数,包括小数点前和小数点后的数字。D:小数点后的位数。Decimal的实际应用场景货币计算、精度计算Java代码方面add(BigDecimalaugend):加法运算//本月总计==本月拓客+本月服务+行动长计划//BigDecimalthisMo......
  • QQ音乐遭遇系统错误:msvcp140.dll丢失的全方位解决指南
    在享受QQ音乐带来的丰富曲库与个性化推荐时,偶尔会遇到让人头疼的技术难题,其中之一便是“msvcp140.dll丢失”的系统错误。这个看似复杂的错误信息实际上指向了一个相对简单的解决路径。本文将为您详细介绍这一问题的起因、影响以及一套行之有效的解决策略,帮助您迅速重回音乐的世......
  • 高精度加法的实现
             这是C++算法基础-基础算法专栏的第七篇文章,专栏详情请见此处。引入    在C++语言中,int的可存储数据范围是-2147483648~2147483647,longlong的可存储数据范围是-9223372036854775808~9223372036854775807,但是如果一些数据比longlong的可存储数据......
  • #A. C08.L01.高精度加法与减法.概述
    一、高精度运算什么是高精度运算?我们都知道,数据类型是有大小范围的。整型数据int能表示的数的范围为:-2147483648至2147483647(-2^31至2^31-1)长整型数据longlong能表示的数的范围为:-9223372036854775808~9223372036854775807(-2^63至2^63-1)。那么当所要求解的数的大小还要......
  • 高精度 减- 高精度
    #include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>a,b;stringm,n;cin>>m>>n;for(inti=m.size()-1;i>=0;i--){a.push_back(m[i]-'0');}for(inti=n.si......
  • SD卡格式化怎么恢复?一键扫描,轻松找回丢失的数据
    SD卡格式化怎么恢复数据?在日常生活中,我们常常会使用SD卡来存储各种数据,如照片、视频、文档等。然而,当SD卡意外格式化或者出现其他问题时,里面的数据就会面临丢失的风险。此时,如何恢复格式化的SD卡就变得尤为重要。本文将为你介绍一种简单易行的恢复方法,帮助你轻松找回丢失的数......
  • 【C/C++项目】——高精度计算pi值
    项目概述导入在现代科学研究和技术开发中,高精度的数值计算是不可或缺的。特别是在物理、天文学、密码学等领域,精确的大数运算对于理论模型的验证和应用实现至关重要。我们要做的是利用该类,计算圆周率到数千甚至数万位的精度,展示其处理复杂数学问题的能力。具体问题描述......
  • 高精度地图制作-更新和维护
    高精度地图制作-更新和维护之前有写过一篇高精度地图制作的介绍,后面也思考了一些问题,其中比较困扰我的是高精度地图如何做到实时更新?高精度地图的维护成本?最近看了ZENRIN公司关于高精度地图的介绍PPT[1],得到了很大的启发,简单的做一个学习记录。附赠自动驾驶最全的学习资料......
  • apollo高精度地图标注
    apollo高精度地图标注附赠自动驾驶最全的学习资料和量产经验:链接上一篇文章已经介绍点云地图的制作方法,完成之后就可以得到城市或园区的三维地图了,之后需要标注语义信息,提供给自动驾驶车辆使用。目前暂时没有找到非常好用的开源语义标注工具,本文采用RoadRunner[1],它是商......
  • 高精度滚珠丝杆在自动化生产中的关键因素!
    如今,自动化技术正以前所未有的速度改变着人们的生活和工作方式,特别是在高精度精密设备的制造与应用领域,提高生产效率和优化生产流程正变得越来越重要。在自动化生产中,滚珠丝杆的优化应用对于提高生产效率、保证产品质量至关重要。滚珠丝杆的优化应用一般是由材料选择与制造工......