scala - 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
。
也许我必须采取其他方法。
谁能帮我解决这个问题?
解决方案
@ scala.math.pow(2, 63)
res0: Double = 9.223372036854776E18
你继续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)
推荐阅读
- python - 使用 minidom 进行 XHTML 解析
- c++ - 为什么 std::move 适用于常量对象
- google-cloud-platform - 如何获取图像系列中未使用的图像列表
- cassandra - Cassandra中多个DC的自动故障转移?
- r - 将数据帧连接到 purrr::map_* 中的嵌套数据帧
- java - 在 Java 中调用多维数组的更好方法是什么?
- linux-kernel - 如何在内核模块中使用跟踪点
- javascript - React Router v4 没有在带有参数的路由中渲染组件
- ios - 'catch' 块无法访问
- android - 如何在服务中获取上下文(不是 applicationContext)