Как обрезать десятичное число с помощью clojure или jython?
в clojure или jython: скажем, у меня есть номер 4.21312312312312 как я могу получить число только с первыми 2 десятичными знаками. Он вернет 4.21 для примера выше. Спасибо
5 ответов
Clojure имеет круглую функцию в clojure.ВНО.математика-вероятно, лучше всего использовать этот, предполагая, что вы хотите правильное поведение со всеми различными возможными числовыми типами, которые может обрабатывать Clojure.
в этом случае и предполагая, что вы хотите получить результат как BigDecimal произвольной точности, простой подход заключается в создании небольшой вспомогательной функции следующим образом:
(use 'clojure.contrib.math)
(defn round-places [number decimals]
(let [factor (expt 10 decimals)]
(bigdec (/ (round (* factor number)) factor))))
(round-places 4.21312312312312 2)
=> 4.21M
Я думаю, что я получил это после дальнейших исследований
(format "%.2f" 4.21312312312312)
должен возвращать 4.21
умножить на 10^numberofdecimals
вы хотите, круглый, а затем разделить. Это не гарантирует, что строковое представление будет округлено правильно, но должно работать большую часть времени. Например:
(* 0.01 (Math/round (* 100 (float (/ 7 8)))))
урожайность 0.88
сделав еще один шаг, вы можете параметизировать количество десятичных знаков:
(defn- factor [no-of-decimal-places]
(.pow (BigInteger. "10") no-of-decimal-places))
(defn truncate [value decimal-places]
(let [divide-and-multiply-by (factor decimal-places)]
(float (/ (int (* divide-and-multiply-by value)) divide-and-multiply-by))))
(truncate 2.23999999 2)
=> 2.23
(truncate 2.23999999 3)
=> 2.239
(truncate 2.23999999 4)
=> 2.2399
нашел этот поток, ищущий аналогичный ответ усечения.
Не уверен, что есть лучшее решение, но придумал следующее.
для некругления вы можете кратно 100 (для 2 десятичных знаков, 1000 для 3 и т. д.), превратиться в целое число, а затем разделить на исходный коэффициент, прежде чем преобразовывать в float для числового вывода. Например:
(float (/ (int (* 100 123.1299)) 100))
=> 123.12
(float (/ (int (* 100 123.1209)) 100))
=> 123.12