bigDecimal的加减乘除,小数位保留,小数位截取

 

首先是bigdecimal的初始化

        BigDecimal num1 = new BigDecimal(0.005);
        BigDecimal num2 = new BigDecimal(1000000);
        BigDecimal num3 = new BigDecimal(-1000000);
        //尽量用字符串的形式初始化
        BigDecimal num12 = new BigDecimal("0.005");
        BigDecimal num22 = new BigDecimal("1000000");
        BigDecimal num32 = new BigDecimal("-1000000");

加法 add()函数     减法subtract()函数

乘法multiply()函数    除法divide()函数    绝对值abs()函数

import java.math.BigDecimal;
import java.util.Scanner;
 
public class TestThree {
 
    public static void main(String[] args) {
 
        BigDecimal num1 = new BigDecimal(0.005);
        BigDecimal num2 = new BigDecimal(1000000);
        BigDecimal num3 = new BigDecimal(-1000000);
        //尽量用字符串的形式初始化
        BigDecimal num12 = new BigDecimal("0.005");
        BigDecimal num22 = new BigDecimal("1000000");
        BigDecimal num32 = new BigDecimal("-1000000");
 
        //加法
        BigDecimal result1 = num1.add(num2);
        BigDecimal result12 = num12.add(num22);
        //减法
        BigDecimal result2 = num1.subtract(num2);
        BigDecimal result22 = num12.subtract(num22);
        //乘法
        BigDecimal result3 = num1.multiply(num2);
        BigDecimal result32 = num12.multiply(num22);
        //绝对值
        BigDecimal result4 = num3.abs();
        BigDecimal result42 = num32.abs();
        //除法
        BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
        BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);
 
        System.out.println("加法用value结果:"+result1);
        System.out.println("加法用string结果:"+result12);
 
        System.out.println("减法value结果:"+result2);
        System.out.println("减法用string结果:"+result22);
 
        System.out.println("乘法用value结果:"+result3);
        System.out.println("乘法用string结果:"+result32);
 
        System.out.println("绝对值用value结果:"+result4);
        System.out.println("绝对值用string结果:"+result42);
 
        System.out.println("除法用value结果:"+result5);
        System.out.println("除法用string结果:"+result52);
    }
}

我把result全部输出可以看到结果

这里出现了差异,这也是为什么初始化建议使用string的原因

除法divide()参数使用

使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错

我们可以看到divide函数配置的参数如下

即为 (BigDecimal divisor 除数, int scale 精确小数位,  int roundingMode 舍入模式)

以看到舍入模式有很多种BigDecimal.ROUND_XXXX_XXX, 具体都是什么意思呢

计算1÷3的结果(最后一种ROUND_UNNECESSARY在结果为无限小数的情况下会报错)

小数位截取setScale

bigDecimal的加减乘除,小数位保留,小数位截取_第1张图片

divide与setScale参数定义

ROUND_CEILING 
Rounding mode to round towards positive infinity. 
向正无穷方向舍入 

ROUND_DOWN 
Rounding mode to round towards zero. 
向零方向舍入 

ROUND_FLOOR 
Rounding mode to round towards negative infinity. 
向负无穷方向舍入 

ROUND_HALF_DOWN 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 

ROUND_HALF_EVEN 
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN 


ROUND_HALF_UP 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 


ROUND_UNNECESSARY 
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 
计算结果是精确的,不需要舍入模式 


ROUND_UP 
Rounding mode to round away from zero. 
向远离0的方向舍入

你可能感兴趣的:(JAVA基础)