加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – 从数据库中读取整数来返回浮点数

发布时间:2020-12-12 13:13:12 所属栏目:百科 来源:网络整理
导读:我们在Oracle DB中有一个表定义为: CREATE TABLE AVALUES( ACODE VARCHAR2(4) NOT NULL,ATYPE NUMBER NOT NULL,ANAME VARCHAR2(50),CREATED DATE DEFAULT SYSDATE) 在Delphi中,我们在类似于此的ADOQuery组件中有一个查询,它将值返回给我们的应用程序: with
我们在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的文档,但最近我没有发现任何重大更改,因此它们应该正常工作.)

有四种方法可以解决它(一种不可能,三种相当容易):

>将数据库列更改为实际上是整数类型而不是NUMBER
>直接询问整数值,并自行转换

AddComponent(‘Name’IntToStr(FieldByName(‘ATYPE’).AsInteger));
>在使用时更改使用该列的代码:

AddComponents(格式(‘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的值,并在完成后将其设置回来.这对我来说似乎是最糟糕的选择;这是在我上面发布的文档链接中执行此操作的示例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读