1

In scheme I can do this:

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

This is called an "exact division".

I was playing with BigDecimal in Java and figured out that you can use its .divide() function to make exact divisions, but this function throws an ArithmeticException if the division is not exact. You can use other similar functions to specify how you want to round, but if I just don't want to round (equivalent in Scheme exact->inexact function).

Is that possible using pure Java? Or maybe a library?

4

3 回答 3

2

Clojure有有理数:

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

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

于 2013-07-13T21:05:32.237 回答
1

有一个库可以做到这一点,是的:apfloat,更准确地说是它的Aprationalclass。另请参阅AprationalMath

于 2013-07-13T10:35:51.870 回答
1

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

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

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

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

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

于 2013-07-13T11:12:21.823 回答