我們有所謂的「小數」自定義類型,其延伸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對象的自定義工廠?
任何幫助將大大讚賞。
是你在Groovy中的MyDecimal類嗎?你可以使用具有自定義平等的委託而不是擴展數字嗎? –
爲了什麼目的,你需要自己的小數? BigDecimal應該提供您需要的一切。 –
tim_yates,沒關係,我們的「MyDecimal」在Java中並不常規。 – Ben