首页 > 解决方案 > Scala BigDecimal - 精度损失

问题描述

我需要用 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

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

谁能帮我解决这个问题?

标签: scalamathprecisionbigdecimalbigint

解决方案


@ scala.math.pow(2, 63)
res0: Double = 9.223372036854776E18

你继续Doublemath.pow然后你将结果传递给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)

推荐阅读