玖叶教程网

前端编程开发入门

BigDecimal使用方式和注意事项~#每天学习一点点

BigDecimal使用方式和注意事项。

大家好,我是不吃辣的chris。今天给大家带来的分享是关于java长文类中bigDecimal的使用。

·BigDecimal可以实现对浮点数的运算,不会造成精度的丢失。通常情况下大部分需要浮点数精确运算结果的业务场景,比如涉及到钱的场景都是通过BigDecimal来做的。如果用常规的基本数据类型,比如float double去计算钱,它的精度是不能够得到保证的。

·下面介绍一下BigDecimal的常见方法。

→第一个就是关于它创建的方法。创建推荐使用的是BigDecimal,参数跟上一个stream类型的对象做入餐,进行构造BigDecimal对象。或者调用BigDecimal的valuable方法,里边可以传入一个double类型的值,这种静态方法去创建对象。

这个地方标红是需要格外注意的,禁止使用BigDecimal,就是像BigDecimal的构造器里传入一个double类型的入餐,去把double值转化为BigDecimal对象。因为是存在精度风险的,这个地方是因为踩过坑,所以这个地方特别标注起来。

→下面介绍一下BigDecimal的加减乘除方法。它的加方法就是add方法,将两个BigDecimal对象相加。substruct方法是用于将两个BigDecimal对象相减。前边的比如a点撒不,假如有一个BigDecimal对象,它的变量名叫a,如果要用a点subs抓克的b就代表a减b。

→然后multiply方法用于将两个BigDecimal对象相减。

→下面就是一个实例,比如在这个地方声明了两个BigDecimal对象,一个变量代表的值是一,另外一个值b代表的是零点九。a调用at方法b得到的结果就是一点九。如果a调用substrasubstrack,b得到的结果就是一减零点九等于零点一。

下边也相同,大家需要注意的就是diy的方法。在使用diy的方法的时候推荐使用的是第三个入餐的版本,并且rodymod尽量不要选择anaccessory,否则就可能会遇到报错。其中scop表示要保留的几位小数,realmemod表示保留规则。常见的保留规则的java类为下边几种。

举例就是上面a点底外的,里边传入三个参数,一个是b,第二个参数二就代表的是保留的位数,第三个参数保就是代表的保留规则。比如现在是用a点dy的b,就是一除以b,零点九一除以零点九的结果肯定就是后边有好多位。

对这个数进行只取前两位小数的这种方式,然后取前两位小数同时还要依据后边help off这样一个规则,下边就是一个数列。比如要取的规则是up这种类型,假如最后的结果是二点五,取了up规则最后实际的结果就是三,就是向上去整。

下面就是大小比较,比如一个对象big,第三步对象a调用compare two方法里边传入另外一个别个第三步对象b,如果a小于b就返回负一,a等于b就返回零,a大于b就返回一。

下面就是保留几位小数,通过可以通过biggest sam有一个size scale方法去设置保留几位小数以及保留规则,保留规则有很多种不需要记。

第二会提示就是上面这些规则,比如现在给它构造一个比格december,它的值是一点二五五四三三,如果给它设置精确的位数就是保留的位数是三位,并且规则就是half down,最后的结果就是一点二五五half down就可以。

可以看一下上面half done这个地方没有列出来,就是对它向下这个曲整,再一个就是等值比较,biggest m是用equals方法进行等值比较会出现的问题是下面这种。

在构建big的散步对象的时候是给它传入的是一b的时候传的是一点零,如果用ecose方法不仅会比较直的大小还会比较精度,就是这两个值看起来都是一,但是它俩的精度不一样,前面精度是一,后边精度是不就是这个一,这个一点零的精度是一,那一的精度是零。

所谓的精度其实就是小数点后的这个位数就是精确的这个位数,它俩值相等,但是它俩精确的位数不同,那一扣子方法就会判断它俩是不相等的,就会反映为false,这也是不希望看到的。

所以调用这个看撇处方法就可以比较两个第三母值,如果相等就返回零,如果第一个数比第二个数大则返回一,反之则返回负一,就是看看实际需求了,如果只是想比较直,可以就是不考虑精度,如果要它俩也严格相等精度也相同,就要调用对应的eq方法。

big decimal一定不会丢失精度吗?不是的,其实big decimal虽然能够尽可能的保证精度,但是也会丢失精度,丢精度丢失的情况分为两种,第一种是不能分解为以二分之一为指数的单位的时间是小数,例如无限循环的小数,未指定位数,big decimal,第三目可以比double更能保证精度的原因在于实进制整数在转换二进制数时是不会有精度问题的。把实进制小数扩大n倍,让它在整数的维数维度上进行计算并保留相应的精度信息就能够保证精度。

但是如果出现了无限循环的计算结果的时候肯定是会出现精度丢失的,比如像一除以三是一个无限循环的小数,零点三三三三三,比如第三目也不是万能的,也只能通过开发者去指定的保留的位数和保留的规则来计算结果。

比如现在去创建一个变量,它的值是一,另外一个变量是三,用一除以三得到的结果就是没有办法得到正确的用因,因为它是无限循环的,只有在指定就是在这个电用里外的方法的时候电用它的三个参数的构造器,给它指定保留的位数和保留的规则才能够正确的计算。

比如在这个位置给它指定的保留三位,然后它是running mode是选择up up这种方法,它就会得出来零点三三四。再一个就是使用big dissemble string之外的其他的构造器,比如前两个变量是用float类型的变量作为入餐转给它,然后去计算一个按的方法。

后边是推荐的,实际用一种比较推荐的方式去传入足事类型的入餐,可以看到结果是下边支付少类型的入餐是能够正确返回的结果的,但是上面刀拨类型就会出现精度丢失,结果就会错误。因为double类型的变量在用二进制保存是本身就存在精度丢失问题,如果把它作为勾到器的输入就无法保证保留的精度。

今天的分享就到这里,感谢大家。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言