【发布时间】:2015-07-02 02:39:27
【问题描述】:
当我尝试将具有值 new BigDecimal("0.0000001") 的属性的实体的值保存到具有数据类型 Number (10,7) 的 Oracle 表列中时,我看到了一个异常。 其他具有相同比例的值,例如新的 BigDecimal ("0.0000012") 被保存。
以下是我看到的例外
13:56:56,561 WARN [JDBCExceptionReporter] SQL 错误:1438,SQLState:22003 13:56:56,561 错误 [JDBCExceptionReporter] ORA-01438: 值大于此列允许的指定精度
【问题讨论】:
-
这被称为 0.1 的不可表示性 en.wikipedia.org/wiki/Floating_point#Accuracy_problems
-
但是保留六位小数的值没有问题 BigDecimal("0.000001")
-
我不相信值 0.0000001 是导致您的问题的原因。您的错误消息中的关键字是 larger:0.0000001 对于您的列来说并不太大,所以这对我来说意味着您的表中发生了一些您没有告诉我们的事情。例如,您的表是否有一个触发器来计算列中值的倒数?请编辑您的问题以包含您看到的异常的完整堆栈跟踪。
-
如果通过sqlplus存储相同的值,它是否有效?如果 JDBC 驱动程序在存储到数据库之前将 BigDecimal 转换为浮点数,那么这是一个错误。也许尝试使用其他版本的驱动程序。 BigDecimal 和 Oracle NUMBER 都将数字存储为十进制数字,无需将它们转换为浮点数。可能它也可能是 Hibernate 中的一个错误。
-
当我尝试从 Toad 保存它时允许
标签: java hibernate jpa oracle11g bigdecimal