数据库里明明是1.05为什么得到的1.04999995231628?(10分)

  • 主题发起人 主题发起人 tt123tt
  • 开始时间 开始时间
T

tt123tt

Unregistered / Unconfirmed
GUEST, unregistred user!
表里只有一条记录
usa hk
8.5 1.05
-------------------------------------------------------------
var
usa,hk :stringe;
begin
sql :='select usa,hk from exchange ' ;
DataModule2.ADOQuery7_pas.SQL.Clear;
DataModule2.ADOQuery7_pas.SQL.Add(sql);
DataModule2.ADOQuery7_pas.Open;
usa:=DataModule2.ADOQuery7_pas.FieldByName('usa').AsString; //取值是对的
hk:=DataModule2.ADOQuery7_pas.FieldByName('hk').AsString; //取值是1.04999995231628
showmessage(usa+'--------'+hk);
end;

怎样才能得到正确的值,我错在哪里?
 
設定值的格式最重要.
因為有可能你這個值是通過其它公式得來的,那麼就會有這種可能了.
 
这两个字段的类型都单精度型,小数位是2
直接从库里读出来的.
 
用BCD格式去读
 
hk:=floattostr(round(DataModule2.ADOQuery7_pas.FieldByName('hk').AsFloat));
 
to : dopro
按你的方法得到的是1
 
可能是配置的原因
BDE+PARADOX下是正确地
 
SQL Server 7 中建立表时,如果字段定义为"Float"类型时,
就有可能出现你这种情况,如果你对精度不是很要求,
用 Money 类型就不会出现你说的这种问题。
 
不好意思,数据库为是ACCESS2000,不过改成货币类型后得到的值是正硧的.
我还是想知道为什么小数位一位时没问题,而两位以上就出问题呢?
货币类型与FLOAT类型区别在哪里?
 
把两列设成如下类型:
字段大小 小数
精度 18
数值范围 2
小数位数 6
可以解决

 
uses FmtBcd;
TField.AsBCD;
TBCDField;
xxxx.FieldByName('xxxx').AsBCD
 
把数值设为“双精度型”就行了
 
风中的狼 说的没错。
 
我以前也碰到这样的问题,double或者real类型的变量,常常因为精度问题
而判断出错,很多时候可以使用formatfloat函数定义其小数位范围,
function FormatFloat(const Format: string; Value: Extended): string;
 
我以前也碰到过这样的问题,特别在double或者real类型的变量需进行比较时,精度比较
确定,有时候可以使用FormatFloat函数解决,
比如:FormatFloat(‘0.00’,DataModule2。ADOQuery7_pas。FieldByName(‘hk)。
AsFloat);
函数定义为:
function FormatFloat(const Format:string;Value:Extended): string;
 
什么数据库,最好不要用单精度的,而要用双精度的
 
我也是用的 ACCESS 2000 的数据库

在单精时出现过这样的问题. 改为 货币型 过 双精型 后就没有问题了.

我以前也在这问过这样的问题.

你找一下就可以找到的. 我现在一般建 表时, 要算的数只好用 双精了.

对了, 我用的 DiamondAccess 控件 操作 数据库,
 
我也遇到过类似的问题(在ACCESS97上)!后改为就没事了.
 

Similar threads

后退
顶部