执行了ADO相关的语句之后浮点数精度变化?
给一个double型变量赋值为一个常量,比如说8.07,这时用FormatFloat查看,他是有误差的,类似于8.07000000000000028这样。
但是,在执行了ADO相关的语句之后,比如说CreateOleObject('ADODB.connection')之后,就没有这个误差了。再给另一个变量同样赋值8.07,用FormatFloat查看,就是8.07,没有后面的尾数。
因为我们现在有另一个没有用到ADO的程序,这样就造成两边的结果不一致。怎样避免这个问题?最好是两边都是有误差的情况,因为另一个程序不能改。
但是,在执行了ADO相关的语句之后,比如说CreateOleObject('ADODB.connection')之后,就没有这个误差了。再给另一个变量同样赋值8.07,用FormatFloat查看,就是8.07,没有后面的尾数。
因为我们现在有另一个没有用到ADO的程序,这样就造成两边的结果不一致。怎样避免这个问题?最好是两边都是有误差的情况,因为另一个程序不能改。
...全文
请发表友善的回复…
发表回复
m_halfman 2007-01-12
- 打赏
- 举报
ADODataSet是有这个属性,但是我现在即使仅仅用了ADOConnection,也会出现我说的问题。而ADOConnection是没有这个属性的。
m_halfman 2007-01-11
- 打赏
- 举报
我不是要把这两个数直接比较,而是要进行一些运算,把结果输出。因为运算中有幂运算,一点误差也会被放得很大。现在两个程序输出的结果确实是不一样的。
dctony 2007-01-11
- 打赏
- 举报
ADODataSet/ADOQuery有个属性EnabledBCD
EnabledBCD=True时,数据集中的浮点数字段是TBCDField,数据类型是Currency
EnabledBCD=False时,数据集中的浮点数字段是TFloatField,数据类型是Double
查看ObjectPascal语法手册,可以看到Currency的精度比Double要高。
所以你可以把浮点数变量设为Currency类型试试,但是Currency对小数点后的位数有限制。
另外你还可以试一下Extended类型。
EnabledBCD=True时,数据集中的浮点数字段是TBCDField,数据类型是Currency
EnabledBCD=False时,数据集中的浮点数字段是TFloatField,数据类型是Double
查看ObjectPascal语法手册,可以看到Currency的精度比Double要高。
所以你可以把浮点数变量设为Currency类型试试,但是Currency对小数点后的位数有限制。
另外你还可以试一下Extended类型。
dctony 2007-01-10
- 打赏
- 举报
那只是假象,浮点数肯定有尾差,两个浮点数比较应该是相减后与一个极小的数比较
function CompareFloat(xFirst, xLast: Double): Integer;
begin
if Abs(xFirst - xLast) < 0.00000001 then
Result := 0
else if xFirst > xLast then
Result := 1
else
Result := -1;
end;
function CompareFloat(xFirst, xLast: Double): Integer;
begin
if Abs(xFirst - xLast) < 0.00000001 then
Result := 0
else if xFirst > xLast then
Result := 1
else
Result := -1;
end;