Che*_*ema 0 math precision scala bigdecimal bigint
我需要用大数字做一些精确计算,我一直在尝试使用 Scala,BigDecimal但我注意到精度损失。
举个例子:
2^63 == 9223372036854775808
2^64 == 18446744073709551616
Run Code Online (Sandbox Code Playgroud)
但是当我做
println(BigDecimal.decimal(scala.math.pow(2, 63)).toBigIntExact())
println(BigDecimal.decimal(scala.math.pow(2, 64)).toBigIntExact())
Run Code Online (Sandbox Code Playgroud)
我得到
9223372036854776000 != 9223372036854775808
18446744073709552000 != 18446744073709551616
Run Code Online (Sandbox Code Playgroud)
我不知道如果我能得到确切的BigInt。
也许我必须采取其他方法。
有人可以帮我解决这个问题吗?
@ scala.math.pow(2, 63)
res0: Double = 9.223372036854776E18
Run Code Online (Sandbox Code Playgroud)
你得到Double的math.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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |