TField.AsFloat将2。70变成2。69999997564,是怎么回事?(20分)

  • 主题发起人 主题发起人 呆非4
  • 开始时间 开始时间
有以下可能, 你数据是计算出来的, 有可能浮点运算有误差,
你可以使用ASCurrency属性进行取值, 你会得到2.70的.
 
float是浮点数,计算机保存浮单数并不象我们直接看到的那样,浮点数的表示方法你自己找书看吧。这个问题可能是由于精度取舍时出现的。
解决办法是使用floattodecimal函数或displayformat函数具体看你在那里用了
精度要求不高时可以取舍
 
FLOAT出错是常有的
 
That's quite normal.
 
是这样的:
表里有一字段是FLOAT(不是 Currency),我想对这字段进行加减等
运算,比如表中的数据为2。70,用户输入2。70,然后我想对它们
进行相减,但结果不是0,而是0。0000009856这样的值。真是气人。
 
是这样的:
表里有一字段是FLOAT(不是 Currency),我想对这字段进行加减等
运算,比如表中的数据为2。70,用户输入2。70,然后我想对它们
进行相减,但结果不是0,而是0。0000009856这样的值。真是气人。
 
浮点数使用科学记数法保存,当然有误差了,ROUND一下就可以了。
 
我的解决办法是自定义一个函数,如下
Function strtoDouble(str : String) : Double;
Var
i : Double;
code : integer;
Begin
val(str, i, code);
result := i;
End;
我的程序中就用了这个函数。
你的是用在数据库中,我想改写一下也许可用。
 
我的主要目的是让数据库不出现271。1200007876而只有271。12这样,只
精确到小数点两位或三位的数据。

 
DisplayFormat,EditFormat方法只是格式化显示,数据库中的
实际值仍是2。69999999985之类的值。
 
>数据库中的实际值仍是2。69999999985之类的值。
好像不太可能,即使再精确,2.7也是2.70000000000...,
因为每个float的小数部分是由N个2E-n累加起来的,
另外float本身定义就有那么多位,你总得把4个字节的0,1填满把.
 
再用Str转换一次不可以吗,我不太好用数据库。
下面的D4中关于Str的例子。不知能行否?上交说的因我的数据是自定义格式,故无问题。
function MakeItAString(I: Longint): string;

{ Convert any integer type to a string }
var
S: string[11];
begin
Str(I, S);
Result:= S;
end;

begin

Canvas.TextOut(10, 10, MakeItAString(-5322));
end;
 
我不知你用的是不是MS SQL Server. 如果是, 你应该在字段类型中使用
numeric(10, 2), 而不是浮点数. 如果是其他的数据库, 有不同的定义方法,
不知可否告诉我你用的是什么数据库?

比如Paradox中你应该在Database Desktop中设置字段的Picture为 *#.##
 
我用的是Paradox。
表结构:有两 个域:
S3 N *
PRICE N

程序是这样的:
float ff;
ff =StrToFloat(Edit1->Text); //** Edit11->Text ="1.10"

Table1->FieldByName("S3")->AsFloat =
Table1->FieldByName("S3)->AsFloat - ff; //*** S3的原值是3.80
//**计算后的值是2.69999999756

我最终的目的是让库的值是2。70

如果不用中间变量却可以,
如:。。。AsFloat = ...AsFloat - StrToFloat(Edit1->Text);
但我程序中还有其他的计算,必须有中间变量。
TO Jimchael:设置Picture ,仅在DESKTOP中会检查,使用上面的程序时,
库中值还是2。69999999756。
TO 心心:我程序中计算的地方很多,如你的转换很烦。
 
多人接受答案了。
 

Similar threads

回复
0
查看
988
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部