Подтвердить что ты не робот

В чем разница между BigDecimal movePointRight и scaleByPowerOfTen?

Со следующим кодом:

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.

В каких обстоятельствах эти два метода дают разные результаты?

4b9b3361

Ответ 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

Ответ 2

Я нашел ответ. Если x объявлен как

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

Тогда a имеет шкалу от 0, но b имеет шкалу от -1. a.toString() дает 34570, b.toString() дает 3.457E + 4