BigDecimal научная запись Строка и нормальная строка - PullRequest
0 голосов
/ 22 января 2019

У меня есть этот кусок кода

BigDecimal a = new BigDecimal("8000000");
BigDecimal b = new BigDecimal("80e5");
System.out.println("a equal b? " +a.compareTo(b));

BigDecimal resultA = a.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);
BigDecimal resultB = b.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);

System.out.println(resultA.compareTo(resultB));
System.out.println(resultA);
System.out.println(resultB);

Результат

a equal b? 0
-1
8000
1E+5

Я не понимаю?почему 8000000/1000 и округление отличаются от 80e5/1000 и округление вверх?И в первый раз java сказал, что a compare до b равно 0 (равно?)

1 Ответ

0 голосов
/ 22 января 2019

Используемый метод divide устанавливает масштаб результата равным масштабу исходного объекта:

BigDecimal.divide (BigDecimal, int)

Возвращает BigDecimal, значение которого (this / divisor), и масштаб которого this.scale ().Если для получения результата с заданным масштабом необходимо выполнить округление, применяется указанный режим округления.

Поскольку вы создаете b из "80e5", его масштаб равен -5, а divide должен округлить результат до 1e + 5:

jshell> var b = new BigDecimal("80e5");
b ==> 8.0E+6

jshell> b.scale()
$4 ==> -5

jshell> var c = b.divide(new BigDecimal("1000"), BigDecimal.ROUND_UP);
c ==> 1E+5

jshell> c.scale()
$6 ==> -5

.Решив это, вы можете установить желаемую шкалу для результата при делении:

jshell> b.divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_UP);
$7 ==> 8000
...