BigDecimal setМасштаб і кругла


140

Яка різниця між цими двома дзвінками? (Чи є?)

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

6
крім прийнятих відповідей нижче - setScale () створює новий об’єкт BigDecimal - з огляду на його непорушний клас
праш

9
@prash roundметод також повертає новий екземпляр BigDecimal, оскільки, як ви сказали, екземпляри незмінні.
дайског

Відповіді:


212

Одним важливим моментом, на який натякають, але безпосередньо не вирішується, є різниця між "точністю" та "шкалою" та способом їх використання у двох твердженнях. "точність" - це загальна кількість значущих цифр у числі. "шкала" - це кількість цифр праворуч від десяткової коми.

Конструктор MathContext приймає лише аргументи точності та RoundingMode, тому масштаб ніколи не вказується в першому твердженні.

setScale() Очевидно приймає шкалу як аргумент, як і RoundingMode, однак точність ніколи не визначається у другому твердженні.

Якщо перемістити десяткову точку на одне місце праворуч, різниця стане зрозумілою:

// 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

38
Re: "" точність "- це загальна кількість цифр у числі." Ні. Точність - кількість значущих цифр. Точність 0,000042М дорівнює 2.
Девід Дж.

2
Див .: "точність": Підрахунок цифр починається від крайньої лівої лівої цифри точного результату. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Едді

якщо "Точність - кількість значущих цифр", то чому точність 0,0000009 дорівнює 2? це має бути 1
Sanchi Girotra

1
Яким чином встановлюється значення вашого BigDecimal? Як виводите значення (використовуючи String.format (), можливо, приховати значні цифри)?
dal peters

1
@SanchiGirotra Точність - це "кількість цифр у незміненому значенні". Точність 2 з немасштабним значенням 90 і шкалою 8 дає 0,0000009. Як і точність 1, незмінне значення 9 і шкала 7.
Дайског

52

Дійсно є велика різниця, про яку слід пам’ятати. setScale дійсно встановлює масштаб вашого числа, тоді як раунд округляє ваш номер до вказаних цифр, АЛЕ "починається з лівої лівої цифри точного результату", як зазначено в jdk. Тож щодо вашої вибірки результати однакові, але спробуйте 0,0034. Ось моя примітка про це в моєму блозі:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.