Scala BigDecimal - 精度损失

Scala BigDecimal - loss of precision

提问人:Chema 提问时间:4/15/2020 最后编辑:jwvhChema 更新时间:4/16/2020 访问量:202

问:

我需要用大数字做一些精确的计算,我一直在尝试用 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 数学 精度 bigdecimal bigint

评论


答:

6赞 Mateusz Kubuszok 4/15/2020 #1
@ scala.math.pow(2, 63)
res0: Double = 9.223372036854776E18

你上了,然后你把结果传递给 - 这意味着你甚至在开始使用类之前就失去了精度。Doublemath.powBigDecimalBig*

如果你在数字还很小的时候输入它们并且还没有失去精度(如果你正确地使用构造函数),那么你会得到预期的结果: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)