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

时间:2018-06-21 06:21:01

标签: 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

2 个答案:

答案 0 :(得分:3)

在第一种情况下,奇怪的结果是由于您正在经历toDouble的事实,由于双精度表示方式限制了精度。

要可靠地将这些字符串转换为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的小片段。

答案 1 :(得分:1)

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