我有一个带有一列的oracle数据库表(数据类型 - NUMBER)。
该列中存储的数据为 1.1 ,
但在 Oracle SQL Developer 中显示为 - 1.10000000000000008881784197001252323389 当我使用 java(JDBC)连接数据库时,它也显示相同。
当我使用 Toad 或 SLQPLUS (使用命令提示符)时,显示正确为1.1
提前致谢。
答案 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>