【发布时间】:2011-04-15 22:10:33
【问题描述】:
在我的应用程序中,我将数字处理为 BigDecimal,并将它们存储为 NUMBER(15,5)。现在我需要在 Java 上正确检查 BigDecimal 值是否适合该列,这样我就可以在不执行 SQL、捕获异常和验证供应商错误代码的情况下生成正确的错误消息。我的数据库是Oracle 10.3,这样的错误导致error 1438。
经过一番谷歌搜索,我没有找到这样的代码,所以我想出了自己的。但我对这段代码真的很不满意......简单,但同时简单到足以怀疑它的正确性。我用许多值、随机值和边界对其进行了测试,它似乎有效。但由于我真的不擅长数字,我想要一些更健壮且经过良好测试的代码。
//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 方法)。抛开异常不谈,此测试方法必须确保数字对于所需的精度来说不会太大,即使是非有效数字也是如此。抱歉,澄清晚了。
感谢您的宝贵时间。
我仍然对这个问题很好奇。我的代码仍在运行,我还没有一些正确或失败情况的“证明”,也没有一些用于此类测试的标准代码。
所以,我悬赏它,希望能得到其中的任何一个。
【问题讨论】:
-
我想到的唯一不同的事情是使用 toString 然后拆分 BD 并比较字符串的长度,但我认为你的方式比这更好。
-
是的,我这样做是为了用随机值测试这个函数数万次......他们总是同意响应(只要我在这个字符串操作版本中去除减号信号)。尽管如此,恕我直言,这是有偏见的测试。
标签: java oracle oracle10g bigdecimal ora-01438