summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2014-12-04 17:55:25 +0100
committerLukas Rytz <lukas.rytz@typesafe.com>2014-12-04 17:55:25 +0100
commit3b1ac0671909fef8a4aef35d62a3dc7fd7d98d9d (patch)
treed35c91c8be4f39e0309ae12f6921a7992004d00c
parent78400a1d74a44fca33d04f9d9aa68a878d286cc2 (diff)
parenta151449afb247b08d470c91f090f683ebc7ba5a4 (diff)
downloadscala-3b1ac0671909fef8a4aef35d62a3dc7fd7d98d9d.tar.gz
scala-3b1ac0671909fef8a4aef35d62a3dc7fd7d98d9d.tar.bz2
scala-3b1ac0671909fef8a4aef35d62a3dc7fd7d98d9d.zip
Merge pull request #4141 from Ichoran/issue/8970
SI-8970 hashCode of BigDecimal and Double do not match
-rw-r--r--src/library/scala/math/BigDecimal.scala4
-rw-r--r--test/junit/scala/math/BigDecimalTest.scala6
2 files changed, 8 insertions, 2 deletions
diff --git a/src/library/scala/math/BigDecimal.scala b/src/library/scala/math/BigDecimal.scala
index 5a81710986..74a174ea74 100644
--- a/src/library/scala/math/BigDecimal.scala
+++ b/src/library/scala/math/BigDecimal.scala
@@ -417,7 +417,7 @@ extends ScalaNumber with ScalaNumericConversions with Serializable {
private final def computeHashCode(): Unit = {
computedHashCode =
if (isWhole && (precision - scale) < BigDecimal.maximumHashScale) toBigInt.hashCode
- else if (isValidDouble) doubleValue.##
+ else if (isDecimalDouble) doubleValue.##
else {
val temp = bigDecimal.stripTrailingZeros
scala.util.hashing.MurmurHash3.mixLast( temp.scaleByPowerOfTen(temp.scale).toBigInteger.hashCode, temp.scale )
@@ -477,7 +477,7 @@ extends ScalaNumber with ScalaNumericConversions with Serializable {
* `isExactDouble`, `isBinaryDouble`, or `isDecimalDouble`, depending on the intended meaning.
* By default, `decimal` creation is used, so `isDecimalDouble` is probably what you want.
*/
- @deprecated("Validity has two distinct meanings. Use `isExactBinaryDouble` or `equivalentToDouble` instead.", "2.11")
+ @deprecated("Validity has distinct meanings. Use `isExactDouble`, `isBinaryDouble`, or `isDecimalDouble` instead.", "2.11")
def isValidDouble = {
val d = toDouble
!d.isInfinity && bigDecimal.compareTo(new BigDec(d)) == 0
diff --git a/test/junit/scala/math/BigDecimalTest.scala b/test/junit/scala/math/BigDecimalTest.scala
index d1ba96fcc8..c7a63da890 100644
--- a/test/junit/scala/math/BigDecimalTest.scala
+++ b/test/junit/scala/math/BigDecimalTest.scala
@@ -222,4 +222,10 @@ class BigDecimalTest {
for (a <- different; b <- different if (a ne b))
assert(a != b, "BigDecimal representations of Double mistakenly conflated")
}
+
+ // Make sure hash code agrees with decimal representation of Double
+ @Test
+ def test_SI8970() {
+ assert((0.1).## == BigDecimal(0.1).##)
+ }
}