在计划中,我可以这样做:
#;> (/ 1 3)
1/3
#;> (exact->inexact (/ 1 3))
0.3333333333333333
这称为"精确划分"。
我在Java中使用BigDecimal
并且发现您可以使用its .divide()
function进行精确划分,但如果除法不准确,则此函数会抛出ArithmeticException
。您可以使用其他类似的函数来指定您想要舍入的方式,但是如果我不想舍入(在Scheme exact->inexact
函数中等效)。
使用纯Java可以吗?或者也许是一个图书馆?
答案 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。