我希望能够将大Double
转换为Integer
,但似乎floor
的Frege Haskell实现不会产生Integral
类型。相反,它似乎是以Java的方式实现接口,并将Floating
类型转换为Double
,Floating r => r -> Double
。我可以使用round
,但是这可以绕而不是截断(尽管我可以减去0.5和然后轮)。我宁愿工作,也不需要求助于使用Int
或Long
,后者与后者一样广泛,但精度仍然有限。
任何方法可以将浮点类型转换为任意精度整数类型吗?
答案 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