【问题标题】:What is the difference between BigDecimal movePointRight and scaleByPowerOfTen?BigDecimal movePointRight 和 scaleByPowerOfTen 有什么区别?
【发布时间】:2014-08-22 19:58:32
【问题描述】:

使用以下代码:

BigDecimal x = new BigDecimal("34.5678");
BigDecimal a = x.movePointRight(3);
BigDecimal b = x.scaleByPowerOfTen(3);
BigDecimal c = x.movePointRight(-3);
BigDecimal d = x.scaleByPowerOfTen(-3);

a 和 b 都是 34567.8,c 和 d 都是 0.0345678。 a.scale()b.scale 都是 1,c.scale()d.scale() 都是 7。

这两种方法在什么情况下会产生不同的结果?

【问题讨论】:

    标签: java math bigdecimal


    【解决方案1】:
    • movePointRight 将防止出现负比例,如果它导致一个。
    • scaleByPowerOfTen 不会阻止这一点。

    示例代码:

    import java.math.BigDecimal;
    
    public class BigDecimalScale {
      public static void main(String... args) {
        long base = 12345;
        int scale = 4;
    
        BigDecimal number = BigDecimal.valueOf(base, scale);
        System.out.println(number);
        BigDecimal pointRight = number.movePointRight(5);
        System.out.println(pointRight + "; my scale is " + pointRight.scale());
        BigDecimal scaleBy = number.scaleByPowerOfTen(5);
        System.out.println(scaleBy + "; my scale is " + scaleBy.scale());
      }
    }
    

    结果:

    1.2345
    123450; my scale is 0
    1.2345E+5; my scale is -1
    

    【讨论】:

    • 这个答案与我自己的答案同时发布,这表明精度也会导致负比例。然而,这个答案的前两行简洁地指出了区别。
    • 还要注意他们有不同的速度stackoverflow.com/questions/21298457/…
    【解决方案2】:

    我找到了答案。 如果 x 被声明为

    BigDecimal x = new BigDecimal("34.5678", new MathContext(4));
    

    那么a的比例为0,而b的比例为-1。 a.toString() 给出 34570,b.toString() 给出 3.457E+4

    【讨论】:

    • 看起来我的答案在帖子中交叉。然而,它显示了一个稍微不同的情况,即初始变量是用精度而不是比例定义的。
    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多