弗雷格双倍整数

Frege Double to Integer

我希望能够将大的 Double 转换为 Integer,但 floor 的弗雷格 Haskell 实现似乎无法生成Integral 类型。相反,它似乎被实现为以 Java 的方式进行交互,并将 Floating 类型转换为 DoubleFloating r => r -> Double。我可以使用 round,但那是四舍五入而不是截断(虽然我可以减去 0.5 和 then 一轮)。我宁愿工作而不需要诉诸于使用 IntLong,它们与后者一样广泛,但精度仍然有限​​。

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

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

您可以做的是将(floored)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.aton 替换为 String.integer ,即 returns

Either NumberFormatException Integer

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

round . floor

您也可以在调用 floor.

后在 Double 结果上调用 intValue

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