如何使用clojure或jython修剪数字的小数?

时间:2011-02-21 23:32:20

标签: clojure decimal jython

在clojure或jython中: 说我有一个号码4.21312312312312 我怎么能得到一个只有前2位小数的数字。对于上面的例子,它将返回4.21。 感谢

5 个答案:

答案 0 :(得分:10)

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   

答案 1 :(得分:5)

我想我在进一步研究后得到了这个

(format "%.2f"  4.21312312312312)

应返回4.21

答案 2 :(得分:3)

乘以你需要的10^numberofdecimals,然后再分割。这并不能保证字符串表示将正确舍入,但应该在大多数情况下都能正常工作。例如:

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

屈服0.88

答案 3 :(得分:1)

更进一步,您可以参数化小数位数:

(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

答案 4 :(得分:0)

发现这个帖子正在寻找类似的截断答案。

不确定是否有更好的解决方案,但想出了以下内容。

对于非舍入,您可以将100乘以100(小数点后2位,1000表示3等),转换为整数然后除以原始因子,然后转换为浮点数字输出。例如:

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

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