java - Scala 2.10 似乎在 BigDecimal 中失去了精度
问题描述
以下测试在 Scala 2.11 和 2.12 中通过,但如 2.10 所示失败
class JsonToXmlParserTest extends Suite with Matchers with AssertionsForJUnit {
@Test
def testBigDecimalPrecision(): Unit = {
val decimalString = "12345678901234567890.12345678901234567890"
val bigDecimal = BigDecimal(decimalString)
val javaBigDecimal = new java.math.BigDecimal(decimalString)
javaBigDecimal.compareTo(bigDecimal.bigDecimal) should be(0)
}
}
org.scalatest.exceptions.TestFailedException: -1 was not equal to 0
at org.scalatest.MatchersHelper$.indicateFailure(MatchersHelper.scala:346)
at org.scalatest.Matchers$ShouldMethodHelper$.shouldMatcher(Matchers.scala:6668)
at org.scalatest.Matchers$AnyShouldWrapper.should(Matchers.scala:6704)
请参阅下面的调试器输出,断点位于测试断言上
精度是BigDecimal
Scala 2.10 中的一个已知问题吗?
解决方案
这是由MathContext
使用中的默认值引起的。Scala 2.10 使用的MathContext
是精度为 34 个字符的 a,Scala 2.11 似乎使用的是精度为 40 个字符的。为了解决这个问题,我可以指定MathContext
使用无限精度,因此更改测试如下通过所有 scala 版本
class JsonToXmlParserTest extends Suite with Matchers with AssertionsForJUnit {
@Test
def testBigDecimalPrecision(): Unit = {
val decimalString = "12345678901234567890.12345678901234567890"
val bigDecimal = BigDecimal(decimalString, MathContext.UNLIMITED)
val javaBigDecimal = new java.math.BigDecimal(decimalString, MathContext.UNLIMITED)
javaBigDecimal.compareTo(bigDecimal.bigDecimal) should be(0)
}
}
推荐阅读
- docker - 在任何来源中都找不到 ast-2.3.0
- mongodb - Docker 容器连接 MongoDB 失败
- c# - EF Core 中的多对多关系
- ios - 代号一 - 设备处于待机状态时套接字关闭
- java - 使用带有可选 JVM 参数的 Groovy AntBuilder()
- google-apps-script - ReferenceError:未定义“驱动器”
- c++ - 使用 Windows API 绘图
- javascript - CasperJS:从提交后加载的页面读取网页
- python-3.x - 根据用户输入更新表
- wordpress - wordpress 页面生成器不显示