2

我希望能够将 large 转换Double为 an Integer,但似乎 Frege Haskell 的实现floor不会产生Integral类型。相反,它似乎被实现为与 Java 的接口方式,并将Floating类型转换为Double, Floating r => r -> Double。我可以使用round,但那是舍入而不是截断(尽管我可能可以减去 0.5然后舍入)。我宁愿在不需要使用Intor的情况下工作Long,后者与后者一样宽,但精度仍然有限​​。

有什么方法可以将浮点类型设置为任意精度整数类型?

4

2 回答 2

3

此功能确实不可用。原因是 Java 显然不提供支持它的方法。

您可以做的是将(下限)double 转换为 String 并将其转换为 Integer。

这是一个例子:

frege> import Prelude.Math(floor)
frege> integerFromDouble d = String.aton ("%.0f".format (floor d))
function integerFromDouble :: Math.Floating a => a -> Integer
frege> integerFromDouble 987654321e20
98765432100000000000000000000

我想知道是否有一种更有效的方法可以以某种方式从 Double 中提取尾数和指数并计算 Integer。

请注意,上述函数是不安全的,因为存在 NaN、+Infinity 和 -Infinity:

frege> integerFromDouble (5/0)
java.lang.NumberFormatException: For input string: "Infinity"

您可以单独检查或替换String.atonString.integer,返回

Either NumberFormatException Integer

如果您可以确保您的计算不超过Long容量,则可以通过以下方式完成您想要的:

round . floor
于 2016-05-08T09:15:04.457 回答
1

您也可以intValueDouble调用floor.

http://docs.oracle.com/javase/6/docs/api/java/lang/Number.html#intValue%28%29

于 2016-05-08T17:44:40.477 回答