Loading

BigDecimal运算

在写老师留的作业的时候(1.   使用for循环计算1+1/2!+1/3!+…+1/20!)本来想用double来直接计算的,但是突然发现精度不够,于是现学了一波BigDecimal,(发现BigDecimal主要用于商业用途em....只做个作业的我应该之后会很少接触了,大概)

这里加个普及吧:Java中float的精度为6-7位有效数字。double的精度为15-16位

一开始就从最基础的初始化开始吧:

我这里就用int,double和string进行转换,结果如下

除了double有些问题外其他的都很正常,先不急,之后我们来看一下运算之后的数值,

现在问题就有些大了,因为double精度的缺失有些严重,所以在进行运算的时候的精度的不准确性就越来越大,至于为什么会这样,就先归功于double的构造方法的结果有一定的不可预知性,而String 构造方法是完全可预知的,但是在正常情况下都会要用double类型的,所以非要用double类型来构造的话,可以使用toString(double)转换String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf,如下图:

或者可以写一个工具类。

接下来就是运算——加,减,乘,除,绝对值:

这里特别强调一下除法,因为不能出现整除的情况可能会报错,所以这个时候我看见除法可以有三个参数,所以就上网查了一下,这三个参数分别是干什么的:

sum1.divide(divisor, scale, roundingMode)
第一个参数是除数;
第二个参数是小数点后保留位数;
第三个参数是舍入模式;好了又有问题,接下来又要看舍入模式了;
这里就直接引入吧:
ROUND_CEILING    //向正无穷方向舍入

ROUND_DOWN    //向零方向舍入

ROUND_FLOOR    //向负无穷方向舍入

ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式

ROUND_UP    //向远离0的方向舍入

接下来总结一下:

1.BigDecimal主要用于商业,应该不会再碰到了(大概)。

2.注意一下再用double类型转换时精度会缺失。

3.运算里注意一下除法。

 

posted @ 2019-10-10 18:10  数学天才琪露诺  阅读(569)  评论(0编辑  收藏  举报