在我的应用程序中,我使用BigDecimal处理数字并将它们存储为NUMBER(15,5)。现在我需要在Java中适当地检查BigDecimal值是否适合该列,以便我可以生成适当的错误消息,而无需执行SQL,捕获异常并验证供应商错误代码。我的数据库是Oracle 10.3,这些错误会导致错误1438。
在一些搜索后,我没有找到这样的代码,因此我想出了自己的代码。但我对这个代码真的不满意...简单,但同时也足够简单,以至于怀疑它的正确性。我使用许多值进行了测试,包括随机数和边界值,并且似乎可以工作。但由于我对数字很差,我需要更加健壮和经过充分测试的代码。
编辑:最近的测试没有出现数字超出范围的异常,只是被默默地舍入了,我不确定这和我第一次测试时有什么不同。这样的舍入是不可接受的,因为应用程序是财务相关的,任何舍入/截断都必须是显式的(通过BigDecimal方法)。除去异常,这个测试方法必须确保数字不会因为非重要数字而过大而失去精度。对于晚期的澄清感到抱歉。
感谢您的时间。
我仍然对这个问题很好奇。我的代码仍在运行,我还没有得到正确性或失败情况的“证明”,或者这种测试的标准代码。
因此,我正在为此提供悬赏,希望能得到其中任何一种。
在一些搜索后,我没有找到这样的代码,因此我想出了自己的代码。但我对这个代码真的不满意...简单,但同时也足够简单,以至于怀疑它的正确性。我使用许多值进行了测试,包括随机数和边界值,并且似乎可以工作。但由于我对数字很差,我需要更加健壮和经过充分测试的代码。
//no constants for easier reading
public boolean testBigDecimal(BigDecimal value) {
if (value.scale() > 5)
return false;
else if (value.precision() - value.scale() > 15 - 5)
return false;
else
return true;
}
编辑:最近的测试没有出现数字超出范围的异常,只是被默默地舍入了,我不确定这和我第一次测试时有什么不同。这样的舍入是不可接受的,因为应用程序是财务相关的,任何舍入/截断都必须是显式的(通过BigDecimal方法)。除去异常,这个测试方法必须确保数字不会因为非重要数字而过大而失去精度。对于晚期的澄清感到抱歉。
感谢您的时间。
我仍然对这个问题很好奇。我的代码仍在运行,我还没有得到正确性或失败情况的“证明”,或者这种测试的标准代码。
因此,我正在为此提供悬赏,希望能得到其中任何一种。