Scala 2.10, похоже, теряет точность в BigDecimal - PullRequest
4 голосов
/ 28 марта 2019

Следующий тест проходит в 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)

См. Вывод отладчика ниже, точка останова была на тестовом утверждении

Debugger Screenshot

Является ли точность BigDecimal известной проблемой в Scala 2.10?

1 Ответ

2 голосов
/ 28 марта 2019

Это вызвано используемым по умолчанию MathContext.Scala 2.10 использует MathContext с точностью до 34 символов, 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)
  }

}
...