有没有办法阻止clojure从6/15开始制作2/5?我需要一个函数来得到比率的原始分母,因此这个问题。
答案 0 :(得分:7)
没有办法阻止clojure从6/15开始2/5。 clojure.lang.Ratio
定义here的相等性最为明显。保留原始的未减少版本会破坏平等。
这听起来像数据类型问题。您将信息放入不保留所需数据量的类型中。从根本上说,您将两个数字放入比率数据类型,这是一个标量值。您(最有可能)需要通过更多信息或将转换延迟到比率。
答案 1 :(得分:3)
GCD的计算不是有条件的:
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Numbers.java#L355
您可以直接创建clojure.lang.Ratio类型:
user=> (def x (clojure.lang.Ratio.
(java.math.BigInteger. "6") (java.math.BigInteger. "15")))
user=> (type x)
clojure.lang.Ratio
user=> x
6/15
但是compareTo假设已经发生了减少,并分别检查分子和分母值:
user=> (def y (/ 6 15))
#'user/y
user=> (type y)
clojure.lang.Ratio
user=> y
2/5
user=> (= x y)
false
其他行动将最终减少:
user=> (* 3 x)
6/5
user=> (* 3 y)
6/5
答案 2 :(得分:3)
奇怪的要求。一个简单的解决方案是不计算,即按原样存储它们
{:n 6 :d 15}
您计算的唯一时间是在结束时,您想要结果,或者您想要检查相等。