You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Clojure化简分数以保留原始分母?

在Clojure中保留分数原始分母的方法

嘿,这个需求很常见!Clojure自带的ratio类型(就是你写6/15得到的那种)确实会自动约分,这是它的设计初衷——保证分数始终是最简形式,避免计算冗余。但如果你就是要保留原始的分子和分母,完全有办法实现,下面给你两种实用思路:

1. 自定义分数数据结构(推荐)

最直接的方式是自己定义一个能存储原始分子、分母的结构,比如用Clojure的defrecord来创建一个清晰的类型:

;; 定义分数记录类型
(defrecord Fraction [numerator denominator])

;; 封装创建分数的函数
(defn create-fraction [num den]
  (->Fraction num den))

;; 用法示例
(def my-fraction (create-fraction 6 15))
;; 输出:#user.Fraction{:numerator 6, :denominator 15}

这个结构会完完整整保留你传入的6和15。如果需要对这类分数做计算,你可以自己实现对应的运算函数,比如加法:

(defn add-fractions [f1 f2]
  (let [num1 (:numerator f1)
        den1 (:denominator f1)
        num2 (:numerator f2)
        den2 (:denominator f2)]
    (create-fraction (+ (* num1 den2) (* num2 den1))
                     (* den1 den2))))

;; 测试加法
(add-fractions (create-fraction 6 15) (create-fraction 2 5))
;; 输出:#user.Fraction{:numerator 60, :denominator 75}

这样既保留了原始分母,又能按需实现计算逻辑,灵活性拉满。

2. 临时用字符串/向量存储(适合简单场景)

如果只是临时需要保留原始形式,不需要复杂计算,也可以直接用字符串或者向量来存:

;; 用向量存储
(def raw-fraction [6 15])

;; 用字符串存储
(def raw-fraction-str "6/15")

不过这种方式在后续计算时需要手动解析,不如自定义类型方便,只适合简单的存储场景。

最后要说明的是:Clojure默认化简分数是为了保证计算的一致性和效率,毕竟最简分数在运算时能减少不必要的数值处理。但只要你有保留原始形式的需求,自定义数据结构是最靠谱的解决方案。

内容的提问来源于stack exchange,提问作者user4813927

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:55:51