2012-01-12 7 views
0

私はさまざまな精度で数字のセットを持っています。私はそれらのハッシュキーを作成する必要があります。 このコードは、数値が(関連する精度で)等しいことを示しています。だから、等しい数の等しい値を返すハッシュ関数は何ですか? 12.34 2 @精度は12だったのでBigDecimal派生コードのハッシュコード

int prec = 2; 
    double val=12.3456; 
    int digits = (int)Math.log(val); 
    MathContext mc = new MathContext(digits+prec); 
    BigDecimal bd = new BigDecimal(12.3020, mc); 
    System.out.println("Value A:"+bd.toString()); 

    MathContext mcx = new MathContext(digits+prec-1); 
    BigDecimal bdx = new BigDecimal(12.3170, mcx); 
    System.out.println("Value A:"+bdx.toString()); 

    System.out.println("Difference is:"+bdx.compareTo(bd)); 
    System.out.println("HashCode A:"+bd.hashCode()); 
    System.out.println("HashCode B:"+bdx.hashCode()); 

ところで、BigDecimalのは、私のために箱から出して動作しませんでした...私は、小数点過去のすべてを達成するために精度を必要としています。 (それでは、もっと適切なライブラリクラスがありますか?)

+2

12.34 2 @精度が実際に12で、精度がすべての桁、小数点以下のないものだけをカウントしているため。 – dasblinkenlight

答えて

2

一つの答えは次のとおりです。

new Double(bd.doubleValue()).hashCode() 

が、これはどういうわけか間違っているなら、私に教えてください。

+0

Java 8では、['Double.hashCode()'](https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#hashCode-double-)があります。つまりJava 8の答えは 'Double.hashCode(bd.doubleValue())'です。 – Andreas

0

Decimal Formatを使って各数値の精度を指定できます。 thisを参照してください。動作しているようです

0

値の最小または有効なスケールがある場合は、hashCode()を実行する前にBigDecimalスケールを設定できます。同じ結果が得られます。操作(setScale丸)...増加または減少 その値に最小の効果を有する記憶された数値の精度を丸め

スケーリング/:BigDecimal documentationあたり。

はここに例を示します

// Setting scale to 2 will make these the equivalent 
BigDecimal val1 = new BigDecimal("1"); 
BigDecimal val2 = new BigDecimal("1.00"); 
BigDecimal val3 = new BigDecimal("1.0000"); 
BigDecimal val4 = new BigDecimal("1.0001"); 
// With scale of 2 - this will be a different value 
BigDecimal diffVal = new BigDecimal("1.01"); 
RoundingMode rounding = RoundingMode.HALF_EVEN; 

assertEquals(val2.setScale(2, rounding), val1.setScale(2, rounding)); 
assertEquals(val2.setScale(2, rounding), val3.setScale(2, rounding)); 
assertEquals(val2.setScale(2, rounding), val4.setScale(2, rounding)); 
assertEquals(val2.setScale(2, rounding).hashCode(), val1.setScale(2, rounding).hashCode()); 
assertEquals(val2.setScale(2, rounding).hashCode(), val3.setScale(2, rounding).hashCode()); 
assertEquals(val2.setScale(2, rounding).hashCode(), val4.setScale(2, rounding).hashCode()); 
assertThat(diffVal.setScale(2, rounding), not(equalTo(val2.setScale(2, rounding)))); 
assertThat(diffVal.setScale(2, rounding).hashCode(), not(equalTo(val2.setScale(2, rounding).hashCode())));