在Clojure或Jython中:
假设我有一个数字4.21312312312312,如何获得只有前两个小数位的数字。对于上面的例子,它将返回4.21。
谢谢
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
[org.clojure/math.numeric-tower "0.0.4"]
,或者是一些更新版本号的相同内容。 - Mars(defn round-places [number decimals] (let [factor (Math/pow 10 decimals)] (double (/ (Math/round (* factor number)) factor))))
函数。 - Phil Huhn经过进一步的研究,我认为我已经理解了这个问题。
(format "%.2f" 4.21312312312312)
应该返回4.21
将要乘以的数字乘以10^小数位数
,四舍五入,然后再除以这个数。这并不能保证字符串表示会被正确地四舍五入,但大多数情况下应该可以使用。例如:
(* 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
(float (/ (int (* 100 123.1299)) 100))
=> 123.12
(float (/ (int (* 100 123.1209)) 100))
=> 123.12