Scalaの2.10はBigDecimalの精度を失うように見えます

conorgriffin:

2.10について示されるように、以下の試験がスカラ2.11と2.12に渡すが、失敗します

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における既知の問題?

conorgriffin:

これはデフォルトによって引き起こされるMathContext使用インチ スカラ2.10が使用されているMathContext34文字の精度で、スカラ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)
  }

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=191268&siteId=1