Как мне обрезать десятичное число с помощью Clojure или Jython? - PullRequest
8 голосов
/ 22 февраля 2011

В Clojure или Jython: скажи, у меня есть номер 4.21312312312312 Как я могу получить число только с двумя первыми десятичными знаками. Это вернуло бы 4.21 для примера выше. Спасибо

Ответы [ 5 ]

10 голосов
/ 22 февраля 2011

Clojure имеет функцию округления в clojure.contrib.math - вероятно, лучше использовать эту, предполагая, что вы хотите корректного поведения со всеми различными числовыми типами, которые может обрабатывать 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   
5 голосов
/ 22 февраля 2011

Я думаю, что получил это после дальнейших исследований

(format "%.2f"  4.21312312312312)

должен вернуть 4,21

3 голосов
/ 22 февраля 2011

Умножьте на 10^numberofdecimals, округлить, а затем разделить. Это не гарантирует, что строковое представление будет правильно округлено, но должно работать большую часть времени. Например:

(* 0.01 (Math/round (* 100 (float (/ 7 8)))))

Урожай 0.88

1 голос
/ 01 июля 2014

Сделав еще один шаг вперед, вы можете параметризовать количество десятичных знаков:

(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
0 голосов
/ 01 июля 2014

Нашел эту ветку в поисках аналогичного усеченного ответа.

Не уверен, что есть лучшее решение, но придумал следующее.

При отсутствии округления вы можете умножить на 100 (для 2 десятичных разрядов, 1000 для 3 и т. Д.), Превратить в целое число и затем разделить на исходный коэффициент, прежде чем преобразовать в число с плавающей точкой для числового вывода. Например:

(float (/ (int (* 100 123.1299)) 100))
=> 123.12

(float (/ (int (* 100 123.1209)) 100))
=> 123.12
...