如何使用Clojure或Jython截取数字的小数部分?

8
在Clojure或Jython中: 假设我有一个数字4.21312312312312,如何获得只有前两个小数位的数字。对于上面的例子,它将返回4.21。 谢谢

1
请特别查看这里的第一个答案:https://dev59.com/-nVC5IYBdhLWcg3w4Vb6 - G__
5个回答

11

Clojure中有一个round函数在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
我是Clojure的新手,可以问一下如何安装Clojure的贡献库吗?当我运行你的代码时,出现了这个错误:user=> (use 'clojure.contrib.math)FileNotFoundException Could not locate clojure/contrib/math__init.class or clojure/contrib/math.clj on classpath: cloj ure.lang.RT.load (RT.java:443) user=> 谢谢! - Nick
对于像Nick这样的问题,clojure.contrib.math现在已经更名为clojure.math.numeric-tower。如果您使用Leiningen,则需要将其包含在依赖项中:[org.clojure/math.numeric-tower "0.0.4"],或者是一些更新版本号的相同内容。 - Mars
我的版本是使用java.lang.math的(defn round-places [number decimals] (let [factor (Math/pow 10 decimals)] (double (/ (Math/round (* factor number)) factor))))函数。 - Phil Huhn

5

经过进一步的研究,我认为我已经理解了这个问题。

(format "%.2f"  4.21312312312312)

应该返回4.21


7
这是数字的字符串表示,而不是数字本身。 - Miki Tebeka

3

将要乘以的数字乘以10^小数位数,四舍五入,然后再除以这个数。这并不能保证字符串表示会被正确地四舍五入,但大多数情况下应该可以使用。例如:

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

产生 0.88


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

0
发现这个线程是在寻找类似截断的答案。
不确定是否有更好的解决方案,但想到了以下方法。
对于非四舍五入,您可以乘以100(2位小数为100,3位小数为1000等),转换为整数,然后除以原始因子,再将其转换为浮点数进行数字输出。例如:
(float (/ (int (* 100 123.1299)) 100))
=> 123.12

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接