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

BigDecimal, точность и масштаб

Я использую BigDecimal для своих номеров в своем приложении, например, с JPA. Я немного изучил термины "точность" и "масштаб", но я не понимаю, что это такое.

Может ли кто-нибудь объяснить мне значение "точность" и "масштаб" для значения BigDecimal?

@Column(precision = 11, scale = 2)

Спасибо!

4b9b3361

Ответ 1

A BigDecimal определяется двумя значениями: произвольным целым числом и 32-разрядной целочисленной шкалой. Значение BigDecimal определяется как unscaledValue*10^{-scale}.

Точность:

precision - это количество цифр в немасштабированном значении. Например, для числа 123.45 возвращаемая точность равна 5.

Таким образом, точность указывает длину произвольного целого числа точности. Вот несколько примеров чисел с одинаковым масштабом, но различная точность:

  • 12345/100000 = 0.12345//scale = 5, precision = 5
  • 12340/100000 = 0.1234//scale = 5, precision = 4
  • 1/100000 = 0,00001//scale = 5, precision = 1

В специальном случае, когда число равно нулю (т.е. 0.000), точность всегда равна 1.

Масштаб:

Если ноль или положительный, scale - это число цифр справа от десятичной точки. Если отрицательное значение, немасштабированное значение числа умножается на десять на силу отрицания шкалы. Например, шкала -3 означает, что значение немасштабированного значения умножается на 1000.

Это означает, что целое значение "BigDecimal" умножается на 10^{-scale}.

Вот несколько примеров одинаковой точности с разными шкалами:

  • 12345 со шкалой 5 = 0.12345
  • 12345 со шкалой 4 = 1.2345
  • ...
  • 12345 со шкалой 0 = 12345
  • 12345 со шкалой -1 = 123450 †

BigDecimal.toString:

Метод toString для BigDecimal ведет себя по-разному на основе шкалы и precision. (Спасибо @RudyVelthuis за указание на это.)

  • Если scale == 0, целое число просто распечатывается как-есть.
  • Если scale < 0, всегда используется E-Notation (например, 5 scale -1 производит "5E + 1" )
  • Если scale >= 0 и precision - scale -1 >= -6 получается простое десятичное число (например, 10000000 scale 1 производит "1000000.0" )
  • В противном случае используется E-нотация, например. 10 scale 8 производит "1.0E-7", поскольку precision - scale -1 равно unscaledValue*10^{-scale} меньше -6.

Дополнительные примеры:

  • 19/100 = 0,19//целое = 19, шкала = 2, точность = 2
  • 1/1000 = 0,0001//integer = 1, scale = 4, precision = 1

Ответ 2

Точность: Общее количество значимых цифр

Масштаб: Число цифр справа от десятичной точки

(Источник)

Ответ 3

Цитата Javadoc:

Точность - это количество цифр в немасштабированном значении.

и

Если ноль или положительный, масштаб - это число цифр справа от десятичной точки. Если отрицательное значение, немасштабированное значение числа умножается на десять на силу отрицания шкалы. Например, шкала -3 означает, что значение немасштабированного значения умножается на 1000.

Ответ 4

В вашем примере аннотации максимальные цифры равны 2 после десятичной точки и 9 до (всего 11): 123456789,01