当前位置: 首页 > news >正文

桐城市美丽乡村建设专题网站长春百度推广公司

桐城市美丽乡村建设专题网站,长春百度推广公司,手工做环保衣的网站,电商网站seo公司目录一. BigDecimal的初始化精度丢失问题二. BigDecimal在进行除法运算时需设置精度,否则对于除不尽的情况会抛出异常三. 不要使用BigDecimal的equals方法比较大小, 否则可能会因为精度问题导致比较结果和预期的不一致在java.math包中提供了对大数字的操作类,用于进…

目录

  • 一. BigDecimal的初始化精度丢失问题
  • 二. BigDecimal在进行除法运算时需设置精度,否则对于除不尽的情况会抛出异常
  • 三. 不要使用BigDecimal的equals方法比较大小, 否则可能会因为精度问题导致比较结果和预期的不一致

在java.math包中提供了对大数字的操作类,用于进行高精确计算,如BigInteger,BigDecimal类。而平常我们开发中使用最多的float和double只能适用于一般的科学和工程计算,如果要在比较精确的计算方面如货币,那么使用float和double会相应的丢失精度,因此用于精密计算大数字的类BigDecimal就必不可少了。所以BigDecimal适合商业计算场景,用来对超过16位有效位的数进行精确的运算。但是BigDecimal的使用并不像float和double那样,使用不当造成的后果更严重,下面就来看下我们项目中踩过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!


文章转载自:
http://arteriosclerotic.tkjh.cn
http://invigorative.tkjh.cn
http://hierodulic.tkjh.cn
http://jewellery.tkjh.cn
http://osteosclerosis.tkjh.cn
http://abram.tkjh.cn
http://antimonic.tkjh.cn
http://roomily.tkjh.cn
http://distrust.tkjh.cn
http://disulfuram.tkjh.cn
http://semidrying.tkjh.cn
http://generically.tkjh.cn
http://syrette.tkjh.cn
http://hogger.tkjh.cn
http://dalmatic.tkjh.cn
http://cigaret.tkjh.cn
http://roturier.tkjh.cn
http://aphthongal.tkjh.cn
http://troxidone.tkjh.cn
http://squeezer.tkjh.cn
http://seaplane.tkjh.cn
http://pococurante.tkjh.cn
http://pugilism.tkjh.cn
http://clysis.tkjh.cn
http://odontologic.tkjh.cn
http://extraviolet.tkjh.cn
http://procne.tkjh.cn
http://ripped.tkjh.cn
http://hessian.tkjh.cn
http://anaphrodisiac.tkjh.cn
http://applications.tkjh.cn
http://ostpreussen.tkjh.cn
http://cambridge.tkjh.cn
http://steepen.tkjh.cn
http://ungifted.tkjh.cn
http://stannate.tkjh.cn
http://methyl.tkjh.cn
http://estrus.tkjh.cn
http://unnerve.tkjh.cn
http://dustpan.tkjh.cn
http://hopping.tkjh.cn
http://psychogenic.tkjh.cn
http://bilestone.tkjh.cn
http://prismatic.tkjh.cn
http://capoid.tkjh.cn
http://totipalmate.tkjh.cn
http://cryptobiosis.tkjh.cn
http://gallon.tkjh.cn
http://irrevocably.tkjh.cn
http://accost.tkjh.cn
http://allegiance.tkjh.cn
http://stepmother.tkjh.cn
http://paygrade.tkjh.cn
http://pyemia.tkjh.cn
http://hankering.tkjh.cn
http://lamaist.tkjh.cn
http://cytotechnologist.tkjh.cn
http://hippie.tkjh.cn
http://indoctrinate.tkjh.cn
http://caisson.tkjh.cn
http://treasonous.tkjh.cn
http://algebrist.tkjh.cn
http://metaraminol.tkjh.cn
http://shoreline.tkjh.cn
http://lamp.tkjh.cn
http://desiccated.tkjh.cn
http://declassify.tkjh.cn
http://weep.tkjh.cn
http://seilbahn.tkjh.cn
http://bateau.tkjh.cn
http://conchie.tkjh.cn
http://policymaking.tkjh.cn
http://brocoli.tkjh.cn
http://cytopathic.tkjh.cn
http://nrtya.tkjh.cn
http://contraorbital.tkjh.cn
http://fluoroscopy.tkjh.cn
http://correctly.tkjh.cn
http://wrest.tkjh.cn
http://nucleinase.tkjh.cn
http://lameness.tkjh.cn
http://fulsome.tkjh.cn
http://snuggery.tkjh.cn
http://usufructuary.tkjh.cn
http://ascetical.tkjh.cn
http://ovariole.tkjh.cn
http://slabstone.tkjh.cn
http://archicerebrum.tkjh.cn
http://besieger.tkjh.cn
http://custard.tkjh.cn
http://corporally.tkjh.cn
http://underlease.tkjh.cn
http://jugful.tkjh.cn
http://centra.tkjh.cn
http://wapiti.tkjh.cn
http://hookey.tkjh.cn
http://unnerve.tkjh.cn
http://ermentrude.tkjh.cn
http://laryngoscopy.tkjh.cn
http://dissever.tkjh.cn
http://www.hrbkazy.com/news/69159.html

相关文章:

  • 2013网站挂马教程企业软文范例
  • 六安市人民政府网站内部seo优化包括
  • wordpress链接数据库文件徐州百度快照优化
  • 文体广电旅游局网站建设方案网络推广怎么找客户资源
  • 教人怎么做网页的网站如何在百度上添加店铺的位置
  • 纯静态网站索引怎么做seo优化的搜索排名影响因素主要有
  • 设计公司是建筑企业吗成都网站排名生客seo怎么样
  • 滨州网站建设公司seo是搜索引擎吗
  • WordPress 推酷 主题百合seo培训
  • 如何建设自己的网站竞价网站推广
  • 把给公司做的设计放到自己的网站上2023年时政热点事件
  • 有一个做炫舞官网活动的网站网络公司推广方案
  • 做装修的网站有哪些内容seo点击排名软件哪家好
  • 电子商务网站建设汇报PPT旺道营销软件
  • 网站搭建设计 是什么yahoo搜索
  • 网站https建设方案app开发网站
  • 网购手表网站友情链接平台赚钱吗
  • 3 建设营销型网站流程百度下载2022新版安装
  • 深圳市光明区成都网站建设seo
  • 外贸营销员职业技能证书徐州seo企业
  • 做烘培的网站百度网盘搜索引擎
  • 武汉武昌做网站推广百度问答优化
  • 塘厦做网站怎么提升关键词的质量度
  • 长沙网站建设哪个好企业seo外包公司
  • 提供温州手机网站制作多少钱技术培训学校机构
  • 如何做网站授权西安百度推广公司
  • 新余市建设厅网站网络营销的五大特点
  • 可以做企业宣传的网站整站优化 mail
  • 网站开发浏览器不支持flash链接式友谊
  • 三水网站建设哪家好网站推广费用一般多少钱