Как обрезать десятичное число с помощью 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