在Java中有类似Scheme的“精确划分”吗?

时间:2013-07-13 10:32:13

标签: java scheme

在计划中,我可以这样做:

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

这称为"精确划分"。

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

使用纯Java可以吗?或者也许是一个图书馆?

3 个答案:

答案 0 :(得分:2)

Clojure有理性数字:

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

无论你是否认为在Clojure中使用你的应用程序是个好主意,你总是可以在Clojure中实现数学运算,甚至可以完全使用Cojure宏,以获得更强的表达能力并编译脚本。一个名称空间是一个类,它很容易在Java类中导入和使用。反过来是最常见的,因为没有Java类库,Clojure几乎没有。他们混合和匹配两种方式。

答案 1 :(得分:1)

有一个库可以执行此操作,是:apfloat,更确切地说是Aprational class。另请参阅AprationalMath

答案 2 :(得分:1)

如果你想直接将1/3之类的东西视为Java代码,那么这将永远以Java的形式进行评估,并被视为原始数字类型之一(例如double,具体取决于你使用哪种类型。)

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

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

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

如果您在Java环境中有很多数学要做,那么可能值得研究JVM上运行的其他语言,例如Jython或Scala