【发布时间】:2012-09-03 15:21:53
【问题描述】:
我需要检查一个 BigDecimal 实例是否是另一个 BigDecimal 实例的倍数。由于我仅限于 Java 1.4,因此无法使用 BigDecimal.remainder(...)。
我想出了以下代码:
/**
* Returns <code>true</code> if <code>multiple</code> is a multiple of <code>base</code>.
*
* @param multiple
* @param base
* @return
*/
public static boolean isMultipleOf(final BigDecimal multiple, final BigDecimal base)
{
if (multiple.compareTo(base) == 0)
return true;
try
{
multiple.divide(base, 0, BigDecimal.ROUND_UNNECESSARY);
return true;
}
catch(ArithmeticException e)
{
return false;
}
}
代码假定仅当multiple 除以base 的商为整数时才不需要舍入。这个假设正确吗?
编辑
结合 Lando 的提示,将商的比例显式设置为 0。否则下面的调用会错误返回true:
isMultipleOf(new BigDecimal("10.25"), new BigDecimal("5"));
编辑
编写了一个 JUnit 测试,发现我必须处理 multiple 和 base 都是 0 的特殊情况。所以我在上面的代码中添加了一个相等性测试。
【问题讨论】:
-
可能是看 Java 1.6 左右的源码,它给了你想要的东西吗?
-
值得注意的是,Java 6 即将结束免费支持,所以如果您升级,我建议直接使用 Java 7。;)
-
难波里,我就是这么做的。然而,由于它具有良好的设计,高级功能是通过对多用途低级功能(主要是私有方法)的特定参数化调用来实现的。我最终会抄袭整个班级。看一看:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
-
@PeterLawrey:是否升级以及何时升级不是我的决定 :( 代码必须在我们的客户应用服务器(SAP NetWeaver WebAS 7.0)上可执行,该服务器仅支持 Java 1.4。
标签: java bigdecimal java1.4