Oracle数据库列数据显示额外的十进制值

时间:2014-06-17 09:50:32

标签: java sql oracle11g sqlplus toad

我有一个带有一列的oracle数据库表(数据类型 - NUMBER)。

该列中存储的数据为 1.1

但在 Oracle SQL Developer 中显示为 - 1.10000000000000008881784197001252323389 当我使用 java(JDBC)连接数据库时,它也显示相同。

当我使用 Toad SLQPLUS (使用命令提示符)时,显示正确为1.1

enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:2)

事实上,Oracle正是准确显示数字。该值是与理想值1.1最接近的64位浮点值。 Toad和SQLPLUS正在做的是将实际存储的值四舍五入到最接近的N个十进制数字。

我建议您阅读:


<强>更新

我刚才注意到你在这里做的是使用浮点数来表示版本号。这是一个坏主意。版本号实际上是符号......而不是您将执行算术运算的数字。最好的想法是将它们表示为字符串,或者表示主要的no,minor no,patch no等的整数对/元组。

将您的软件包版本号作为符号处理将避免您现在遇到的问题...这可能是由于不精确的表示问题,或者是浮点中的舍入错误&lt; - &gt;字符串转换。

答案 1 :(得分:2)

列中存储的数据正是SQL Developer向您展示的内容。它和JDBC向您展示实际价值,其他客户则没有。 SQL * Plus和Toad将数字四舍五入以进行显示。默认情况下,SQL * Plus makes the number fit into 10 characters但您可以使用显式格式掩码覆盖它:

create table t42 (package_version number);
insert into t42 values (1.10000000000000008881784197001252323389);

select * from t42;

PACKAGE_VERSION
---------------
            1.1

set numformat 9.99999999999999999999999999999999999999
select * from t42;

                          PACKAGE_VERSION
-----------------------------------------
 1.10000000000000008881784197001252323389

或隐含地with set numwidth

set numformat ""
set numwidth 40
select * from t42;

                         PACKAGE_VERSION
----------------------------------------
1.10000000000000008881784197001252323389

您也可以使用numwidth在SQL Developer工作表中查看相同的显示更改。屏幕截图中的表浏览器视图始终显示整个值。

因此,您需要首先了解该数字是如何生成的,并且可能需要更正它。正如StephenC建议的那样,它看起来像一个浮点计算问题,但是为什么可能已经为该行生成了包版本号,而不是简单地设置为1.1,这一点并不明显。 / p>