我们已经有了一个表中的Oracle数据库定义为:阅读整数浮点
CREATE TABLE AVALUES
(
ACODE VARCHAR2(4) NOT NULL,
ATYPE NUMBER NOT NULL,
ANAME VARCHAR2(50),
CREATED DATE DEFAULT SYSDATE
)
在德尔福我们在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而不是,这会导致应用程序崩溃。我们尝试过寻找问题,但它非常间歇 - 通过远程桌面连接到客户端计算机,我们无法复制它。
对于我可以做的事情有什么建议可以进一步调查?由于它是间歇性的,只发生在几台电脑上,所以很难调试。我认为这可能是Oracle客户端的问题,但我不确定我们如何才能真正验证这一点。
感谢您的任何帮助。
整数在IEEE754浮点中完全可表示。必须对这样的值进行计算才能返回。似乎很奇怪。你如何将这些值放入数据库中?你是否在执行浮点计算?如果你认为这是一个整数,你为什么要作为浮点存储?如果它确实是一个整数,那么解决方案就是以整数形式存储。 –
ATYPE是否真的需要Oracle NUMBER全浮点精度?或者你能否声明一些类似NUMBER(6)的东西? NUMBER根据您声明的方式来处理不同的情况。使用适当的声明还可以节省列大小的空间,由公式ROUND((length(p)+ s)/ 2))+ 1给出,其中p是精度,s取值为0或1,取决于数字标志。如果您只是使用NUMBER,p = 38。另外NUMBER不会以IEEE754格式存储数据。 BINARY_FLOAT和BINARY_DOUBLE做。有关详细信息,请参阅“Oracle数据库SQL参考”。 –