【问题标题】:Is there something like Scheme's "exact division" in Java? [duplicate]Java中有没有类似Scheme的“精确除法”的东西? [复制]
【发布时间】:2013-07-11 20:19:36
【问题描述】:

在方案中我可以这样做:

#;> (/ 1 3)
1/3
#;> (exact->inexact (/ 1 3))
0.3333333333333333

这称为“精确除法”。

我在 Java 中使用 BigDecimal 并发现您可以使用 its .divide() function 进行精确除法,但如果除法不精确,此函数会抛出 ArithmeticException。您可以使用其他类似的函数来指定要如何舍入,但如果我不想舍入(等效于 Scheme exact->inexact 函数)。

这可能使用纯 Java 吗?或者图书馆?

【问题讨论】:

    标签: java scheme


    【解决方案1】:

    如果您想将1/3 之类的内容直接视为Java 代码,则始终会在Java 中以一种或另一种方式对其进行评估,并将其视为一种原始数字类型(例如double,具体取决于您使用的类型)。

    如果您想将1/3 保留为分数,则需要有一个库将其建模为分数。本质上,您正在寻找一种能够在 Java 中进行符号数学运算的工具。您可能不需要一个非常强大的(例如,您可能不需要能够区分的东西),但它至少需要能够表示分数,并且可能对它们进行一些基本运算和简化(我想这就是你的意思)重新之后)。

    Apache Commons Maths (Fractions section) 应该很有趣。您可能还对此问题中引用的一些库感兴趣:https://stackoverflow.com/q/2574949/372643

    不幸的是,Java 不允许运算符重载,因此用 Java 编写数学代码可能非常乏味。通常,您必须将数学表达式作为文本输入,并期望库或多或少透明地使用其自己的类对表达式进行建模,或者您必须在对象上使用方法,例如add、mult、 ...

    如果您在 Java 环境中需要进行大量数学运算,那么可能值得研究在 JVM 上运行的其他语言必须提供哪些功能,例如 Jython 或 Scala。

    【讨论】:

      【解决方案2】:

      Clojure 有理数:

      %> clojure
      Clojure 1.0.0-
      user=> (/ 1 3)
      1/3
      

      无论您是否认为在 Clojure 中制作应用程序是一个好主意,您都可以始终在 Clojure 中实现数学运算,甚至可以充分利用 Cojure 宏,以获得更多的表达能力并编译脚本。一个命名空间就是一个类,它很容易在 Java 类中导入和使用。反过来也是最常见的,因为没有 Java 类库,Clojure 几乎一无所有。它们混合搭配两种方式。

      【讨论】:

        【解决方案3】:

        有一个库可以做到这一点,是的:apfloat,更准确地说是Aprational class。另见AprationalMath。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-25
          • 2011-01-20
          • 1970-01-01
          • 2011-02-26
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          相关资源
          最近更新 更多