我写了一个测试,并希望将BigDecimal结果与期望值进行比较。我想使用方法
所以在代码中,我有一个方法返回保留2位小数的BigDecimal。在测试用例中,我知道它返回没有非零小数位的数字。因此,我想创建一个具有0刻度的BigDecimal,并将返回的BigDecimal修剪到相同的刻度。
更复杂的是,我现在有一个方法
所以简单的问题是:如何通过最小负载修改BigDecimal实例以修剪末尾的小数零。
想要的效果如下:
我的代码看起来像这样:
也许存在另一种Junit比较方法可以消除相同的错误,但我不知道它是什么。谢谢你的帮助。保尔。
Assert.assertEquals(BigDecimal, BigDecimal)
,因为如果失败,它会显示精确的比较值,在eclipse中我可以显示比较窗口。所以在代码中,我有一个方法返回保留2位小数的BigDecimal。在测试用例中,我知道它返回没有非零小数位的数字。因此,我想创建一个具有0刻度的BigDecimal,并将返回的BigDecimal修剪到相同的刻度。
更复杂的是,我现在有一个方法
getDecimal(Object [,Optionaly int scale])
,它可以从任何具有正确toString()
值的对象创建BigDecimal,默认刻度为99。我在主要的“重”代码中使用它,因此这个方法必须非常快(不必创建其他对象,不使用正则表达式等)。所以简单的问题是:如何通过最小负载修改BigDecimal实例以修剪末尾的小数零。
想要的效果如下:
0.010 -> 0.01
5.000 -> 5
100 -> 100 not 1E+2
回复:
someTrim(new BigDecimal("100.00")).equals(new BigDecimal(100))
做一些类似数学的东西
100.00 / (2, 99, DOWN) * 50.00 -> 2500
我的代码看起来像这样:
public static BigDecimal getDecimal( Object value ) {
// null here probably work beter, but dont want number longer then 99 decimal digits
return getDecimal( value, 99 );
}
public static BigDecimal getDecimal( Object value, Integer scale ) {
if ( value == null )
return null;
BigDecimal result = ( value instanceof BigDecimal ) ? ( BigDecimal ) value : new BigDecimal( value.toString() );
if ( scale == null )
return result;
return result.setScale( scale, DOWN );
}
// Main heavy method could call this 100 000 times per tenant (cca 1500 tenants), of course not expect all in same time, but can severals
public static myModify(E entity){
return myModify( entity.getValue(), entity.getDivisor(), entity.getMultiplicator() );
}
public static myModify( BigDecimal value, Integer divisor, BigDecimal multiplicator){
return value.divide( getDecimal(divisor), 99, RoundingMode.DOWN ).multiply( multiplicator );
}
@Test
public void myModifyTest(){
// Constructor have param: value, divisor, multiplicator
E entity = new E(new BigDecimal("100.00"), 2, new BigDecimal("50.00"));
// Should pass
Assert.assertEquals(getDecimal(100), entity);
// Should drop: java.lang.AssertionError: expected:<50> but was:<100>
Assert.assertEquals(getDecimal(50), entity);
// Not want: java.lang.AssertionError: expected:<5E+1> but was:<1E+2>
}
也许存在另一种Junit比较方法可以消除相同的错误,但我不知道它是什么。谢谢你的帮助。保尔。
getDecimal
方法,一个接受BigDecimal
,另一个接受String
。然后你将大大简化你的代码,并减少可能的错误。 - Software EngineercompareTo()
而不是equals()
。 - Software Engineer