【问题标题】:Frege Double to IntegerFrege Double 到 Integer
【发布时间】:2016-05-08 01:30:50
【问题描述】:

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

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

【问题讨论】:

标签: java haskell casting floor frege


【解决方案1】:

此功能确实不可用。原因是 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.aton 替换为 String.integer ,这会返回

Either NumberFormatException Integer

如果你能确保你的计算不超过Long的容量,你想要的可以用:

round . floor

【讨论】:

    【解决方案2】:

    您也可以在调用floor 后在Double 结果上调用intValue

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

    【讨论】:

    • 显然,OP 使用的数字大到连 Long 都不够。
    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多