Oracle:更新查询后的精度错误

时间:2012-08-23 13:17:11

标签: sql oracle

我在更新查询时遇到问题。我正在将balance1字段更新为6442450941.026600。

update account_subscriber set total_balance1=6442450941.026600
 where SUB_ID='xyz'

但结果如下(在我们得到的选择stmt之后)

TOTAL_BALANCE1 6442450941.02659988

第二种情况: 让我们使用以下值进行更新

update account_subscriber set total_balance1=6442450941.4567
 where SUB_ID='xyz'

结果是6442450941.45670032。

能帮助我理解为什么精度会发生变化。

Sql * plus版本的版本是10.2.0.3.0

谢谢和问候, Chandra Bhushan Bakshi

4 个答案:

答案 0 :(得分:3)

我能想到的唯一解释是,在数据库和显示它的位置之间的某个路径中,它被转换为浮点值。我将PL / SQL Developer用于我的Oracle开发工具并认为它非常可靠。因此,当我运行以下内容时,想象一下我的意外:

create TABLE rpj_test (val number(22, 8));

INSERT INTO rpj_test(val) VALUES (6442450941.026600);

SELECT * FROM rpj_test;

我得到了您报告的确切结果(6442450941.02659968)。 WTF?!?!?

但后来我问自己一个重要的问题 - 如何测试这个以确保自己确实数据实际上在数据库中?所以我运行了以下查询:

SELECT val * 10000 FROM rpj_test;

得到了我预期的答案(64424509410266)。

所以看来数据库中的数据是正确的。毫不奇怪 - 我认为Oracle的NUMBER类型是该产品中最好的未被注意的功能之一,它已经永远存在,并且它是坚如磐石的(如果我们希望我们的系统有机会正常工作,那就更好了: - )。好的,所以在我看来这看起来像是一个浮点转换错误 - 我该怎么办呢?所以关闭我在PL / SQL Developer的首选项配置对话框中,我在SQL窗口选项卡上找到了一个标题为“Number fields to_char”的简洁设置,但没有检查。我检查了这个,重新运行了第一个SELECT查询,然后看到数据按预期显示。

故事的道德:

  1. NUMBER正确计算和存储。如果你认为你发现了一个错误,那么一遍又一遍地认为真的 真的很难。测试它十六种不同的方式。弄清楚你怎么能证明这实际上并不是一个错误。
  2. 您使用的工具会影响您获得的结果。
  3. 分享并享受。

答案 1 :(得分:0)

您提供的值无法通过接收列的数据类型解析到所需的精度。如果您需要精确到百万分之,如问题所示,您应该检查表字段的数据类型的精度并相应地进行调整。

答案 2 :(得分:0)

这是因为您使用的是不精确的数据类型。

答案 3 :(得分:0)

这只是一个pl / sql开发人员显示问题。 在PL / SQL开发人员中,选择“工具”菜单和“首选项”选项,然后在“SQL”窗口中键入“数字”布局,取消选中格式化选项并选择任何其他选项并查看正确的结果。 :)