我知道我可以解析Long
从String
类似下面
"60".toLong
Run Code Online (Sandbox Code Playgroud)
或Long
从Double
如下转换
60.0.toLong
Run Code Online (Sandbox Code Playgroud)
或转换Long
来自一个String
的Double
类似于下面
"60.0".toDouble.toLong
Run Code Online (Sandbox Code Playgroud)
但是,我不能执行以下操作
"60.0".toLong
Run Code Online (Sandbox Code Playgroud)
所以我的问题是使用是否.toDouble.toLong
是最佳实践,还是应该使用类似的东西try ... catch ...
?
同时,还有一个问题,当我尝试将一个非常大的转换Long
为 时Double
,可能会有一些精度损失,我想知道如何解决这个问题?
"9223372036854775800.31415926535827932".toDouble.toLong
Run Code Online (Sandbox Code Playgroud)
Try
无论如何,您应该将操作包装在 a 中,以防字符串无效。
你在里面做什么Try
取决于"60.0"
你的应用程序中是否是一个有效的值。
如果有效,则使用两步转换。
Try("60.0".toDouble.toLong) // => Success(60)
Run Code Online (Sandbox Code Playgroud)
如果无效,请使用一步版本。
Try("60.0".toLong) // => Failure(java.lang.NumberFormatException...)
Run Code Online (Sandbox Code Playgroud)
回答更新的问题:
9223372036854775800.31415926535827932
超出 a 的范围Double
,因此您需BigDecimal
要这样做。
Try(BigDecimal("9223372036854775800.31415926535827932").toLong)
Run Code Online (Sandbox Code Playgroud)
但是你是非常接近的最大值Long
,所以如果真的数字是大我建议避免Long
使用BigDecimal
和BigInt
。
Try(BigDecimal("9223372036854775800.31415926535827932").toBigInt)
Run Code Online (Sandbox Code Playgroud)
请注意,toLong
如果BigDecimal
太大不会失败,它只会给出错误的值。