【问题标题】:Scala BigDecimal - loss of precisionScala BigDecimal - 精度损失
【发布时间】:2020-07-28 07:00:50
【问题描述】:

我需要对 Big Numbers 进行一些精度计算,我一直在尝试使用 Scala BigDecimal,但我注意到精度损失。

举个例子:

2^63 == 9223372036854775808
2^64 == 18446744073709551616

但是当我这样做时

println(BigDecimal.decimal(scala.math.pow(2, 63)).toBigIntExact())
println(BigDecimal.decimal(scala.math.pow(2, 64)).toBigIntExact())

我明白了

9223372036854776000 != 9223372036854775808
18446744073709552000 != 18446744073709551616 

不知道能不能得到准确的BigInt

也许我必须采取其他方法。

谁能帮我解决这个问题?

【问题讨论】:

    标签: scala math precision bigdecimal bigint


    【解决方案1】:
    @ scala.math.pow(2, 63)
    res0: Double = 9.223372036854776E18
    

    您在math.pow 上获得Double,然后将结果传递给BigDecimal - 这意味着您甚至在开始使用Big* 类之前就已经丢失了精度。

    如果您将数字放入BigDecimal 时,它们仍然很小并且还没有丢失精度(并且如果您正确使用构造函数),那么您将获得预期的结果:

    @ BigDecimal(2).pow(63).toBigInt
    res4: BigInt = 9223372036854775808
    
    @ BigDecimal(2).pow(64).toBigInt
    res5: BigInt = 18446744073709551616
    
    @ BigDecimal(2).pow(63).toBigIntExact
    res6: Option[BigInt] = Some(9223372036854775808)
    
    @ BigDecimal(2).pow(64).toBigIntExact
    res7: Option[BigInt] = Some(18446744073709551616)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2021-09-27
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多