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

如何使用clojure或jython修剪数字的小数点?,clojure,decimal,jython,Clojure,Decimal,Jython,在clojure或jython中: 假设我有一个号码4.21312312 我怎样才能得到一个只有前两位小数的数字呢。对于上面的示例,它将返回4.21。 谢谢用所需的10^numberofdecimals相乘,四舍五入,然后除法。这并不能保证字符串表示形式将被正确舍入,但在大多数情况下都应该有效。例如: (* 0.01 (Math/round (* 100 (float (/ 7 8))))) (float (/ (int (* 100 123.1299)) 100)) => 123.12

在clojure或jython中: 假设我有一个号码4.21312312 我怎样才能得到一个只有前两位小数的数字呢。对于上面的示例,它将返回4.21。
谢谢

用所需的
10^numberofdecimals
相乘,四舍五入,然后除法。这并不能保证字符串表示形式将被正确舍入,但在大多数情况下都应该有效。例如:

(* 0.01 (Math/round (* 100 (float (/ 7 8)))))
(float (/ (int (* 100 123.1299)) 100))
=> 123.12

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

产量
0.88

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

(format "%.2f"  4.21312312312312)

应该返回4.21

Clojure在Clojure.contrib.math中有一个round函数-如果您希望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   

发现此线程正在寻找类似的截断答案

不确定是否有更好的解决方案,但提出了以下建议

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

(* 0.01 (Math/round (* 100 (float (/ 7 8)))))
(float (/ (int (* 100 123.1299)) 100))
=> 123.12

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

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

(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

请特别注意这里的第一个答案:这是数字的字符串表示,而不是数字本身。我是Clojure的新手,请问如何为Clojure安装贡献库?当我运行您的代码时,我得到了以下信息:user=>(使用'clojure.contrib.math)FileNotFoundException无法在类路径上找到clojure/contrib/math\uu init.class或clojure/contrib/math.clj:cloj-ure.lang.RT.load(RT.java:443)user=>谢谢!对于那些有尼克问题的人来说,clojure.contrib.math现在是clojure.math.numeric-tower。如果您使用Leiningen,则需要将其包含在依赖项中:
[org.clojure/math.numeric-tower“0.0.4”]
,或者与更高版本号相同。我的版本
(defn round places[number decimals](let[factor(math/pow 10 decimals)](double(/(math/round(*factor number))factor)
它使用java.lang.math