Frege Double to Integer

时间:2016-05-08 01:30:50

标签: java haskell casting floor frege

我希望能够将大Double转换为Integer,但似乎floor的Frege Haskell实现不会产生Integral类型。相反,它似乎是以Java的方式实现接口,并将Floating类型转换为DoubleFloating r => r -> Double。我可以使用round,但是这可以绕而不是截断(尽管我可以减去0.5和然后轮)。我宁愿工作,也不需要求助于使用IntLong,后者与后者一样广泛,但精度仍然有限​​。

任何方法可以将浮点类型转换为任意精度整数类型吗?

2 个答案:

答案 0 :(得分:3)

此功能确实无法使用。原因是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中提取尾数和指数并计算整数。

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

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

您可以单独检查,也可以将String.aton替换为String.integer,然后返回

Either NumberFormatException Integer

如果您可以确保您的计算不超过Long容量,那么您可以完成以下任务:

round . floor

答案 1 :(得分:1)

您也可以在致电intValue后致电Double结果上的floor

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