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.运算里注意一下除法。