BigDecimal setScale and round

后端 未结 2 828
独厮守ぢ
独厮守ぢ 2020-11-29 17:19

What is the difference between this two call? (Is there any?)

// 1.
new BigDecimal(\"3.53456\").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new Bi         


        
相关标签:
2条回答
  • 2020-11-29 17:39

    One important point that is alluded to but not directly addressed is the difference between "precision" and "scale" and how they are used in the two statements. "precision" is the total number of significant digits in a number. "scale" is the number of digits to the right of the decimal point.

    The MathContext constructor only accepts precision and RoundingMode as arguments, and therefore scale is never specified in the first statement.

    setScale() obviously accepts scale as an argument, as well as RoundingMode, however precision is never specified in the second statement.

    If you move the decimal point one place to the right, the difference will become clear:

    // 1.
    new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
    //result = 35.35
    // 2.
    new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
    // result = 35.3456
    
    0 讨论(0)
  • 2020-11-29 17:45

    There is indeed a big difference, which you should keep in mind. setScale really set the scale of your number whereas round does round your number to the specified digits BUT it "starts from the leftmost digit of exact result" as mentioned within the jdk. So regarding your sample the results are the same, but try 0.0034 instead. Here's my note about that on my blog:

    http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

    0 讨论(0)
提交回复
热议问题