Scala BigDecimal - 精度损失
Scala BigDecimal - loss of precision
我需要用 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.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)
我需要用 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.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)