У меня есть XSD, который требует от меня использовать BigDecimal для lat/lon. В настоящее время у меня есть lat/lon как двойники и конвертируйте их в BigDecimal, но мне нужно всего лишь использовать около 12 мест. Я не смог понять, как это установить. Кто-нибудь может мне с этим помочь?Установить конкретную точность BigDecimal
ответ
Вы можете использовать setScale(), например.
double d = ...
BigDecimal db = new BigDecimal(d).setScale(12, BigDecimal.ROUND_HALF_UP);
Duh. Оглядываясь назад на ошибку, которую я получил, он сказал, что округление было необходимо. Я только сделал .setScale (12). Как только я подтвержу это, я сделаю это как ответ. Благодарю. – Jason
Я не знаю, почему он не просто использует метод округления по умолчанию, например, кастинг, я видел только ROUND_HALF_UP. Это довольно педантично. ;) –
+1, так как это помогло мне с моей автоматизации сегодня :) – Brian
Название вопроса спрашивает о точности. BigDecimal различает масштаб и точность. Масштаб - это число десятичных знаков. Вы можете думать о точности как число significant figures, также известное как значимые цифры.
Некоторые примеры в Clojure.
(.scale 0.00123M) ; 5
(.precision 0.00123M) ; 3
(В Clojure, The M
обозначает BigDecimal буквальным. Вы можете перевести Clojure на Java, если вам нравится, но я считаю, что это будет более компактным, чем Java!)
Вы можете легко увеличить масштаб:
(.setScale 0.00123M 7) ; 0.0M
Но вы не можете снижения шкалы в точно так же:
(.setScale 0.00123M 3) ; ArithmeticException Rounding necessary
Вам необходимо пройти режим округления тоже:
(.setScale 0.00123M 3 BigDecimal/ROUND_HALF_EVEN) ;
; Note: BigDecimal would prefer that you use the MathContext rounding
; constants, but I don't have them at my fingertips right now.
Таким образом, можно легко изменить масштаб. Но как насчет точности? Это не так просто, как вы могли бы надеяться!
Легко уменьшение точности:
(.round 3.14159M (java.math.MathContext. 3)) ; 3.14M
Но это не очевидно, как увеличение точность:
(.round 3.14159M (java.math.MathContext. 7)) ; 3.14159M (unexpected)
Для скептиков, это не просто вопрос о завершающих нулях не отображается:
(.precision (.round 3.14159M (java.math.MathContext. 7))) ; 6
; (same as above, still unexpected)
FWIW, Clojure осторожны с замыкающими нулями и будут показать им:
4.0000M ; 4.0000M
(.precision 4.0000M) ; 5
назад на трассе ... Вы можете попробовать использовать BigDecimal конструктор, но он не устанавливает точность выше чем число разрядов, которые вы указали:
(BigDecimal. "3" (java.math.MathContext. 5)) ; 3M
(BigDecimal. "3.1" (java.math.MathContext. 5)) ; 3.1M
Таким образом, нет быстрого способа изменить точность. Я потратил время на борьбу с этим, написав этот вопрос и с проектом, над которым я работаю. Я считаю это, в лучшем случае, API CRAZYTOWN, а в худшем - ошибкой. Люди. Шутки в сторону?
Таким образом, лучшее, что я могу сказать, если вы хотите изменить точность, вам необходимо сделать следующие шаги:
- Lookup тока точности.
- Посмотрите текущий масштаб.
- Рассчитать изменение масштаба.
- Установите новую шкалу
Эти шаги, как и Clojure код:
(def x 0.000691M) ; the input number
(def p' 1) ; desired precision
(def s' (+ (.scale x) p' (- (.precision x)))) ; desired new scale
(.setScale x s' BigDecimal/ROUND_HALF_EVEN)
; 0.0007M
Я знаю, это много шагов, просто чтобы изменить точность!
Почему BigDecimal не предоставляет это? Я что-то пропустил?
Как насчет 'BigDecimal.round (новый MathContext (точность, RoundingModel.ROUND_HALF_EVEN))'? –
@ PaŭloEbermann Вы спрашиваете или предлагаете? Ты это пробовал? Помогите поделиться подробными результатами для примеров, которые я пропустил в своем ответе? Если это так, я думаю, что это требует отдельного ответа. –
Для любого, кто похож на меня и не знает немного Clojure, я думаю, что здесь показано решение: x.setScale (x.scale() + p - x.precision(), RoundingMode.HALF_UP) ', где' x' является 'BigDecimal', который вы хотите объединить, а' p' - количество значимых цифр, которые вы хотите сохранить. Он работает для меня, но поправьте меня, если я ошибаюсь! – Nateowami
BigDecimal decPrec = (BigDecimal)yo.get("Avg");
decPrec = decPrec.setScale(5, RoundingMode.CEILING);
String value= String.valueOf(decPrec);
Таким образом, вы можете установить конкретную точность BigDecimal
.
Здесь значение decPrec было 1,5726903423607562595809913132345426 , который округляется до 1.57267
Попробуйте этот код ...
Integer perc = 5;
BigDecimal spread = BigDecimal.ZERO;
BigDecimal perc = spread.setScale(perc,BigDecimal.ROUND_HALF_UP);
System.out.println(perc);
Результат: 0,00000
- 1. Точность переполнения BigDecimal операций
- 2. BigDecimal, точность и масштаб
- 3. BigDecimal теряет точность после умножения
- 4. Как установить определенную точность для BigDecimal в Java?
- 5. JiBX: Как указать точность для Bigdecimal
- 6. BigDecimal точность не сохраняется с аннотациями JPA
- 7. Методы BigDecimal идти вниз масштаб и точность
- 8. Как изменить точность BigDecimal в Grails
- 9. Денежная точность в Java (не BigDecimal)
- 10. Установить все операции BigDecimal с определенной точностью?
- 11. Clojure - Как установить более низкую точность
- 12. Где установить точность GPS
- 13. Как установить точность поплавка
- 14. Установить точность внутри функции
- 15. Как получить точность данных типа BigDecimal в @Entity классе
- 16. Как проверить точность и масштаб с помощью BigDecimal?
- 17. CakePHP Установить конкретную версию
- 18. Как установить конкретную дату?
- 19. Установить конкретную версию dnx
- 20. Логарифм BigDecimal
- 21. Как установить точность на число
- 22. Как установить точность выходного файла?
- 23. BigDecimal bigDecimal = BigDecimal.ONE;
- 24. Максимальная точность ниже неограниченного?
- 25. APT: установить конкретную версию пакета
- 26. BigDecimal precision в классе шкал Scala
- 27. значения BigDecimal хочет установить новый масштаб
- 28. BigDecimal до значения денежных
- 29. Десятичная точность вопроса | Большой Десятичный
- 30. Дисплей BigDecimal произвольному Precision
Вы пробовали давать конструктор MathContext? – bdares
Если я правильно вижу, вы говорите о десятичных разрядах, а не о точности с плавающей запятой. По крайней мере, принятый ответ приведет к 12 десятичным знакам, а не к 12 цифрам точности. – vbence