2015-05-05 29 views
1

我們有所謂的「小數」自定義類型,其延伸java.lang.Number中Groovy的NumberMath默認爲IntegerMath爲未知數量的類型

我們使用Groovy /斯波克對某些單元/驗收測試。

我們注意到了一些神祕的行爲。

在下面的代碼,myDecimal的真實價值是9.91

assert myDecimal == new Decimal(「9.91」) // succeed. 
assert myDecimal == new Decimal(「9.02」) // succeed. What?? 
assert myDecimal == new Decimal(「8.99」) // fail. 

我們的一個開發者發現org.codehaus.groovy.runtime.typehandling.NumberMath.java一些代碼[常規-ALL-2.2.1 ]

public static NumberMath getMath(Number left, Number right) { 
    if (isFloatingPoint(left) || isFloatingPoint(right)) { 
     return FloatingPointMath.INSTANCE; 
    } 
    if (isBigDecimal(left) || isBigDecimal(right)) { 
     return BigDecimalMath.INSTANCE; 
    } 
    if (isBigInteger(left) || isBigInteger(right)) { 
     return BigIntegerMath.INSTANCE; 
    } 
    if (isLong(left) || isLong(right)){ 
     return LongMath.INSTANCE; 
    } 
    return IntegerMath.INSTANCE; 
} 

看到這種方法很明顯,我們的自定義Decimal類將被分配一個IntegerMath。當聲明非整數時,會導致「破壞」的斷言。

有沒有人知道解決這個問題的方法?例如有沒有辦法提供一個NumberMath對象的自定義工廠?

任何幫助將大大讚賞。

+0

是你在Groovy中的MyDecimal類嗎?你可以使用具有自定義平等的委託而不是擴展數字嗎? –

+0

爲了什麼目的,你需要自己的小數? BigDecimal應該提供您需要的一切。 –

+0

tim_yates,沒關係,我們的「MyDecimal」在Java中並不常規。 – Ben

回答

0

我看到這個解決的方法有兩種:1。 如果可用數學實例之一(比方說,BigDecimalMath)可以恰當地比較你的號碼,然後更改基類的十進制的相應 2。否則,嘗試和變化NumberMath的元類中的getMath方法。它很髒,我甚至不確定是否可以使用Metaclass更改Groovy本身。這就是說,我覺得在一個多餘的時刻檢查這個...

相關問題