2012-01-12 66 views
0

我有一組數字,其精度各不相同。我需要從它們中創建一個hashkey。 此代碼顯示數字相等(以相關精度)。那麼,什麼是散列函數可以爲相等的數字返回相等的值?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()); 

BTW,BigDecimal的未開箱的我,因爲12.34 @ 2精度爲12 ...我需要的精度來實現一切都會過去的小數點。 (因此,是否有更合適的庫類?)

+2

12.34 @ 2精度確實是12,因爲精確計算所有的數字,不僅小數點後的人。 – dasblinkenlight 2012-01-12 16:44:21

回答

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 2017-07-13 21:14:08

0

您可以使用Decimal Format指定每個數字的精度。見this。這似乎工作

0

如果您對這些值有最小或有效的比例,那麼您可以在採用hashCode()之前設置BigDecimal比例,並且您將得到相同的結果。每BigDecimal documentation

標度/舍入操作(setScale和round)......增加或減少 存儲數的精度在其 價值的影響最小。

下面是一個例子:

// 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())));