gpt4 book ai didi

oracle - 从数据库读取整数返回 float

转载 作者:行者123 更新时间:2023-12-03 15:16:49 26 4
gpt4 key购买 nike

我们在 Oracle DB 中有一个表定义为:

CREATE TABLE AVALUES
(
ACODE VARCHAR2(4) NOT NULL,
ATYPE NUMBER NOT NULL,
ANAME VARCHAR2(50),
CREATED DATE DEFAULT SYSDATE
)

在 Delphi 中,我们在 ADOQuery 组件中有一个类似于此的查询,它将值返回到我们的应用程序:

with qryComp do
begin
Close;
SQL.Text :=
'SELECT ATYPE FROM AVALUES ORDER BY CREATED';
Open;
while not EOF do
begin
AddComponents('NAME' + FieldByName('ATYPE').AsString);
Next;
end;
Close;
end;

部署在许多不同的客户端 PC 上,多年来它一直运行良好,我们的代码中没有任何变化。然而,在一些客户端 PC 上,它最近开始返回 1.999999999969 而不是 2,这会导致应用程序崩溃。我们已尝试查找问题,但问题非常间歇性 - 通过远程桌面连接到客户端计算机,我们根本无法复制它。

对于我可以采取哪些措施来进一步调查此问题,您有什么建议吗?由于它是间歇性的并且仅发生在少数计算机上,因此很难调试。我认为这可能是 Oracle 客户端的问题,但我不确定我们如何实际验证这一点。

感谢您的帮助。

最佳答案

我能看到的唯一可能的是客户端计算机上的 FPU 控制字之间的差异,导致精度的处理方式不同,因为处理浮点类型时存在固有的舍入问题。 (请参阅 Delphi 文档中的 Set8087CW;该链接适用于 XE2 的文档,但据我所知,最近没有重大变化,因此它们应该可以工作。)

有四种方法可以修复它(一种不太可能,三种相当简单):

  • 将数据库列更改为实际上的 integer 类型,而不是 NUMBER

  • 直接请求整数值,然后自行转换

    AddComponent('名称' + IntToStr(FieldByName('ATYPE').AsInteger));

  • 在使用时更改使用该列的代码:

    AddComponents(Format('NAME%d', [FieldByName('ATYPE').AsInteger]));

或者在AddComponents本身中:

procedure AddComponents(Prefix: string; Value: Integer);
begin
DoWhateverIDo(Prefix + IntToStr(Value));
end;

// calling code
AddComponents('Name', FieldByName('ATYPE').AsInteger);
  • 在使用数据库之前显式设置 8087CW 的值,并在完成后将其设置回来。这对我来说似乎是最糟糕的选择;我上面发布的文档链接中有一个执行此操作的示例。

关于oracle - 从数据库读取整数返回 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10701815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com