java - Scala - 将大数或科学数转换为 Long

标签 java scala long-integer biginteger bigdecimal

需要能够将 00000924843571390729101 或 2.71000000000000000E+02 转换为 Long 期望2.71000000000000000E+02变成271

funky results for this: 00000924843571390729101 became 924843571390729088
val signNumber = "00000924843571390729101"

val castnum = signNumber.toDouble.toLong.toString

下面的第一个转换适用于 2.71000000000000000E+02,第二个适用于 00000924843571390729101

val castnum = signNumber.toDouble.toLong.toString
val castnum = signNumber.replaceAll("\\.[0-9]*$", "").toLong.toString

不想保留任何小数位所以不使用 java.math.BigDecimal

输入字符串可能是 9028456928343.0000,在这种情况下需要 9028456928343 作为 Long

最佳答案

第一种情况的奇怪结果是由于您正在通过 toDouble,由于 double 的表示方式限制了精度。

要可靠地将这些字符串转换为 Long,您可以尝试 BigDecimal::longValueExact,如下所示:

import java.math.BigDecimal

new BigDecimal("00000924843571390729101").longValueExact()
// 924843571390729101: Long
new BigDecimal("9028456928343.0000").longValueExact()
// 9028456928343: Long
new BigDecimal("2.71000000000000000E+02").longValueExact()
// 271: Long

由于您还有带有十进制数字的字符串,因此您必须使用一种可以识别这些数字的解析形式,即使您不想保留该信息也是如此。

如果您丢失任何信息,此方法将抛出一个 ArithmeticInformation,这意味着该数字不适合 Long 或它具有非零小数部分。如果您想更宽松一些,可以使用 BigDecimal::longValue

import java.math.BigDecimal
import scala.util.Try

​Try(new BigDecimal("9028456928343.0001").longValueExact())
// Failure(java.lang.ArithmeticException: Rounding necessary): scala.util.Try
Try(new BigDecimal("9028456928343.0001").longValue())
// Success(9028456928343): scala.util.Try

您可以尝试使用这段小代码 here on Scastie

关于java - Scala - 将大数或科学数转换为 Long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50961644/

相关文章:

java - Spring Batch 作业随机抛出 FAILED 和 COMPLETED 之间的不同退出状态

scala - 如何在 Spark Streaming 中将 RDD 转换为 DataFrame,而不仅仅是 Spark

java - Java中Long对象和基本类型long有什么区别?

java - java 中的 unsigned long,使用 BigInteger 进行算术运算,但 BigInteger.toByteArray 返回 14 个字节而不是 8 个字节

java - 带有 map 的 fragment : cast issue

java - 有没有办法有选择地调试 JVM 中的单个应用程序(或几个应用程序)?

Java:一个函数有多种返回类型...可以使用泛型吗?

scala - 宏返回类型取决于参数

scala - 有条件地连接到数据库

java - Long.parseLong 给出 NumberFormatException