广告
返回顶部
首页 > 资讯 > 精选 >Java中使用BigDecimal要注意什么
  • 515
分享到

Java中使用BigDecimal要注意什么

2023-07-05 04:07:00 515人浏览 八月长安
摘要

这篇文章主要介绍“Java中使用BigDecimal要注意什么”,在日常操作中,相信很多人在Java中使用BigDecimal要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中使用BigDec

这篇文章主要介绍“Java中使用BigDecimal要注意什么”,在日常操作中,相信很多人在Java中使用BigDecimal要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中使用BigDecimal要注意什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一. BigDecimal的初始化精度丢失问题

先来看下面代码的运行结果:

BigDecimal bd1 = new BigDecimal(0.1);System.out.println("bd1="+bd1);BigDecimal bd2 = new BigDecimal("0.1");System.out.println("bd2="+bd2);BigDecimal bd3 = BigDecimal.valueOf(0.1);System.out.println("bd3="+bd3);

输出结果:

bd1=0.1000000000000000055511151231257827021181583404541015625
bd2=0.1
bd3=0.1

如果是float或double类型转Bigdecimal,不要使用new BigDecimal()转, 使用valueOf()方法 或 new BigDecimal(“”)转成string,否则有可能出现精度问题。

《Effective Java》这本书里说过:
如果需要精确的答案,请避免使用float和double

因为float和double执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,就像十进制不能准确的表示1/3(1/3=0.3333…)也就是说二进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合,例如:

  • 0.5能够表示,因为它可以表示成为1/2

  • 0.75也能够表示,因为它可以表示成为1/2+1/(2^2)

  • 0.875也能够表示,因为它可以表示成为1/2+1/(22)+1/(23)

  • 但是0.1不能够精确表示,因为它不能够表示成为1/(2^n)的和的形式

System.out.println(0.5*3);System.out.println(0.1*3);

大家可以本地执行下这两行代码,看下输出结果就知道为什么二进制不能表示0.1却可以表示0.5了。所以其实不是BigDecimal的问题,BigDecimal就是为了满足精确运算存在的,问题出在0.1它本身就一个不准确的值,这其实跟BigDecimal无关,但在使用的时候需要注意用法。

二. BigDecimal在进行除法运算时需设置精度,否则对于除不尽的情况会抛出异常

继续看下面的代码执行结果:

BigDecimal bd4 = new BigDecimal("10");BigDecimal bd5 = new BigDecimal("3");System.out.println(bd4.divide(bd5));

输出结果:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1690)
at BigDecimalTest.main(BigDecimalTest.java:38)

应该向下面这样设置小数点后的位数,以及超出后是四舍五入和向上/向下取整或者直接舍弃:

System.out.println(bd4.divide(bd5,2,BigDecimal.ROUND_DOWN));

第二个参数表示小数位数,第三个参数表示超出的位数直接舍弃(当然也可以设置四舍五入,向上取整等)

三. 不要使用BigDecimal的equals方法比较大小, 否则可能会因为精度问题导致比较结果和预期的不一致

BigDecimal bd1 = new BigDecimal("0");BigDecimal bd2 = new BigDecimal("0.0");System.out.println(bd1.equals(bd2));System.out.println(bd1.compareTo(bd2) == 0)

输出结果:

equals:false
compareTo:true

如果你无法确定你的BigDecimal值有小数情况,最好用compareTo!

补充:BigDecimal比较值大小避坑

注意点

但是,对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小。这也是很多人比较容易踩的坑。下面给大家做一下示例:

 BigDecimal bigDecimal1 = new BigDecimal("1.350000000000"); BigDecimal bigDecimal2 = new BigDecimal("1.35"); System.out.println("bigdecial1:"+bigDecimal1); System.out.println("bigdecail2:"+bigDecimal2); System.out.println(bigDecimal1.equals(bigDecimal2)); //false System.out.println(bigDecimal1.compareTo(bigDecimal2)); // 0 代表相等

运行结果:

bigdecial1:1.350000000000
bigdecail2:1.35
false
0

到此,关于“Java中使用BigDecimal要注意什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java中使用BigDecimal要注意什么

本文链接: https://www.lsjlt.com/news/349498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中使用BigDecimal要注意什么
    这篇文章主要介绍“Java中使用BigDecimal要注意什么”,在日常操作中,相信很多人在Java中使用BigDecimal要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中使用BigDec...
    99+
    2023-07-05
  • Java中BigDecimal使用注意避坑指南
    目录前言一. BigDecimal的初始化精度丢失问题二. BigDecimal在进行除法运算时需设置精度,否则对于除不尽的情况会抛出异常三. 不要使用BigDecimal的equa...
    99+
    2023-02-20
    java bigdecimal用法 bigdecimal类型数据处理 java中bigdecimal
  • 注意Java中 new BigDecimal(double val) 的使用
    目录问题解决总结前言: 今天下午跑单元测试报错,发现一个关于 new BigDecimal(double val) 的代码问题,总结下。 问题 业务代码: public stati...
    99+
    2022-11-13
  • java dom4j使用要注意什么
    使用dom4j时需要注意以下几点:1. 引入dom4j库:在项目中引入dom4j库,可以通过maven或手动引入jar包的方式。2....
    99+
    2023-08-08
    java dom4j
  • java中CAS使用需要注意什么
    这篇文章将为大家详细讲解有关java中CAS使用需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • Java java.sql.Timestamp时间戳使用要注意什么
    使用Java中的java.sql.Timestamp类表示时间戳时,需要注意以下几点:1. 时间戳是一个特殊的时间数据类型,用于表示...
    99+
    2023-08-09
    Java
  • Java编程中需要注意什么
    本篇内容介绍了“Java编程中需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 尽量在合适的场合使用单例使用单例可以减轻加载的负担...
    99+
    2023-06-17
  • Python中使用Lambda要注意什么
    这篇文章主要介绍了Python中使用Lambda要注意什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。lambda被认为是非常Python的语言,是Python编程中比较受...
    99+
    2023-06-01
  • 使用sortablejs要注意什么
    这篇文章主要讲解了“使用sortablejs要注意什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用sortablejs要注意什么”吧! 1. 这个方...
    99+
    2022-10-19
  • java赋值运算符使用要注意什么
    在Java中,赋值运算符(=)用于将一个值赋给一个变量。在使用赋值运算符时,需要注意以下几点: 赋值运算符是右结合的,即从右向左...
    99+
    2023-10-28
    java
  • C#中使用CLR需要注意什么
    这篇文章主要为大家展示了“C#中使用CLR需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中使用CLR需要注意什么”这篇文章吧。1、C# CLR之foreach的性能问题 fore...
    99+
    2023-06-17
  • 使用View.post()需要注意什么
    这篇文章给大家分享的是有关使用View.post()需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言有时候,我们会需要用到 View.post() 方法,来将一...
    99+
    2022-10-19
  • java使用new创建对象时要注意什么
    在使用Java的`new`关键字创建对象时,需要注意以下几点:1. 类必须具有公共的构造方法:在使用`new`关键字创建对象时,需要...
    99+
    2023-10-10
    java
  • Java中BigDecimal的加减乘除、比较大小与使用注意事项
    前言借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结...
    99+
    2023-05-30
    java bigdecimal 加减乘除
  • 使用Go defer时要注意什么
    本篇内容介绍了“使用Go defer时要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用 Go defer 要小心这 2 个折腾人...
    99+
    2023-06-20
  • python pipeline使用时要注意什么
    这篇文章主要讲解了“python pipeline使用时要注意什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python pipeline使用时要注意什么”吧!说明在使用之前需要在set...
    99+
    2023-06-20
  • 使用HTML5 Canvas需要注意什么
    小编给大家分享一下使用HTML5 Canvas需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 下面对我们在实际开发...
    99+
    2022-10-19
  • 使用香港VPS要注意什么
    使用香港VPS要注意事项:为了避免数据丢失,备份很重要。VPS在开通后防火墙默认是关闭的,对防火墙不熟悉的朋友建议不要开启防火墙。香港VPS上有很多重要的端口,修改端口须谨慎。尽量不要安装多余程序,避免中毒。在合理范围内下载超大数据和软件。...
    99+
    2022-10-25
  • 使用美国VPS要注意什么
    使用美国VPS要注意:1、需要给美国VPS做好数据备份,防止数据丢失;2、不熟悉防火墙配置,尽量不要在美国VPS上开启防火墙,避免出现人为故障问题;3、需要谨慎修改美国VPS的端口信息,避免修改失误造成美国VPS无法正常使用;4、不要在美国...
    99+
    2022-10-04
  • cdn购买使用要注意什么
    cdn购买使用要注意:1、选择正规提供商提供的CDN加速服务,避免网站经常被病毒攻击,导致无法访问;2、不要为搜索引擎设置指定的独立...
    99+
    2023-02-17
    cdn购买使用 cdn
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作