BigDecimal_对象的创建特殊的0110比较方法舍入策略

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BigDecimal_对象的创建特殊的0110比较方法舍入策略相关的知识,希望对你有一定的参考价值。

文章目录

①. 初始化BigDecimal对象

  • ①. 在我们的日常计算中,有时会涉及到比较大的数字之间的计算(如:超大金额的计算,如果是韩元等的话,还要大),这时,使用float、double这样的浮点数就不那么准确了。因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。

  • ②. 在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

  • ③. BigDecimal bigDecimal = new BigDecimal(xxx);其中,xxx可以是整型数据,也可以是数字内容的字符串数据,但不可以是浮点型数据

 BigDecimal bigDecimal1 = new  BigDecimal(123);
 BigDecimal bigDecimal2 = new  BigDecimal("123.123");
 BigDecimal bigDecimal3 = new  BigDecimal(123.123);
 System.out.println(bigDecimal1);//123
 System.out.println(bigDecimal2);//123.123
 System.out.println(bigDecimal3);//123.1230000000000046611603465862572193145751953125

②. 特殊的0、1、10的创建

  • ①. 特殊的0、1、10可以这么创建:
BigDecimal zero = BigDecimal.ZERO;
BigDecimal one = BigDecimal.ONE;
BigDecimal ten = BigDecimal.TEN;
  • ②. BigDecimal.ZERO等同于 new BigDecimal(0);
  1. BigDecimal类加载阶段的准备阶段,这些数组就会被初始化了,那自然就可以正常的提供使用,可以把这些数组中定义的各个BigDecimal类型的对象当作缓存,然后优先取缓存中的对象,避免创建重复的对象,这也能够起到优化代码的作用
  2. 跟进BigDecimal类中,会发现BigDecimal类中已经定义了一些BigDecimal类型的常量数组,如下:
  3. 用BigDecimal.ZERO替代new BigDecimal(0)只是一个引子,更多想表达的是,以后要定义BigDecimal类时,先看看有没现成的对象能够使用,避免一些没必要的操作
    // Constants
    /**
     * The value 0, with a scale of 0.
     *
     * @since  1.5
     */
    public static final BigDecimal ZERO =
        zeroThroughTen[0];
    // Cache of common small BigDecimal values.
    private static final BigDecimal zeroThroughTen[] = 
        new BigDecimal(BigInteger.ZERO,       0,  0, 1),
        new BigDecimal(BigInteger.ONE,        1,  0, 1),
        new BigDecimal(BigInteger.valueOf(2), 2,  0, 1),
        new BigDecimal(BigInteger.valueOf(3), 3,  0, 1),
        new BigDecimal(BigInteger.valueOf(4), 4,  0, 1),
        new BigDecimal(BigInteger.valueOf(5), 5,  0, 1),
        new BigDecimal(BigInteger.valueOf(6), 6,  0, 1),
        new BigDecimal(BigInteger.valueOf(7), 7,  0, 1),
        new BigDecimal(BigInteger.valueOf(8), 8,  0, 1),
        new BigDecimal(BigInteger.valueOf(9), 9,  0, 1),
        new BigDecimal(BigInteger.TEN,        10, 0, 2),
    ;

③. bigDecimalA.compareTo(bigDecimalB)

  • ①. BigDecimalA > bigDecimalB时,比较结果为1

  • ②. BigDecimalA = bigDecimalB时,比较结果为0

  • ③. BigDecimalA < bigDecimalB时,比较结果为-1

BigDecimal bigDecimal1 = new BigDecimal("4.321");
BigDecimal bigDecimal2 = new BigDecimal("1.234");
BigDecimal bigDecimal3 = bigDecimal1.subtract(bigDecimal2);
System.out.println(bigDecimal1.compareTo(bigDecimal2));//1
System.out.println(bigDecimal2.compareTo(bigDecimal1));//-1
System.out.println(bigDecimal3.compareTo(bigDecimal3));//0

④. BigDecimal的舍入策略

//(1). 取精度为小数点后5位; 策略为四舍五入
BigDecimal bigDecimal1 = bigDecimal.setScale(5, BigDecimal.ROUND_HALF_UP);
System.out.println("策略为四舍五入 = " + bigDecimal1);//bigDecimal1 = 1.97456

// (2). ROUND_CEILING:无论后面是多少(后面是0的话除外),在正常值下,往大变:
BigDecimal bigDecimal2 = new BigDecimal("1.974562460");
// 在正常值下,往大变2.0
System.out.println("在正常值下,往大变"+bigDecimal2.setScale(1,bigDecimal2.ROUND_CEILING));
BigDecimal bigDecimal3 = new BigDecimal("-1.974562460");
//在正常值下,往大变-1.97
System.out.println("在正常值下,往大变"+bigDecimal3.setScale(2,bigDecimal3.ROUND_CEILING));

//(3). ROUND_FLOOR:无论后面是多少(后面是0的话除外),在正常值下,往小变
BigDecimal bigDecimal4 = new BigDecimal("1.974562460");
// 在正常值下,往小变1.9
System.out.println("在正常值下,往小变"+bigDecimal2.setScale(1,bigDecimal2.ROUND_FLOOR));
BigDecimal bigDecimal5 = new BigDecimal("-1.974562460");
// 在正常值下,往小变-1.98
System.out.println("在正常值下,往小变"+bigDecimal3.setScale(2,bigDecimal3.ROUND_FLOOR));
//(4). ROUND_UP:无论后面是多少(后面是0的话除外),在绝对值的角度,往大变:
//(5). ROUND_DOWN:无论后面是多少,都直接丢弃:
//(6). ROUND_HALF_UP:0-4舍,5-9入,在绝对值的角度,舍和入:
//(7). ROUND_HALF_DOWN:0-5舍,6-9入,在绝对值的角度,舍和入:
//(8). ROUND_HALF_EVEN:0-4舍,6-9入,;在绝对值的角度舍和入如果是5,则结果为偶数的一边:

以上是关于BigDecimal_对象的创建特殊的0110比较方法舍入策略的主要内容,如果未能解决你的问题,请参考以下文章

BigDecimal精度与相等比较的坑

浅析BigDecimal的使用

数据类型比较:Long和BigDecimal

java 中 BigDecimal 怎么与 0 比较

java怎么设置bigdecimal值

4.1.7 特殊方法与运算符重载