三个问题,寻求答案(100分)

  • 主题发起人 主题发起人 zwyu
  • 开始时间 开始时间
Z

zwyu

Unregistered / Unconfirmed
GUEST, unregistred user!
1、为什么n:=6.1+0.1不会等于6.2,而是6.19999999999999,程序如下:
procedure TForm1.Button1Click(Sender: TObject);
var n:double;
begin
n:=strtofloat(trim(edit1.text)); {edit1.text='1'}
repeat
showmessage(floattostr(n));
n:=n+0.1
until n>=20
end;
如何使两数值相加时,不会出现上面程序所出的精度误差?

2、table1.filter只能过滤数值字段吗?如不是,能举例说明字符字段、
日期字段等的filter如何写?

3、dbgrid控件中的日期字段显示99/03/08,有文章说能通过displayformat
属性设为1999/03/08显示,delphi4中我怎么找不到displayformat属性?
 
1.这是计算的精度问题,可以用四舍五入的方法解决.准确的说,就是自己
处理啦!
2.请等待...
3.拖出一个query, 在上面双击,打开一个窗口,在里面添一个字段,
再在字段上面轻轻地敲一下即可看见displayformat属性.
 
2.先把帮助贴上,程序随后就到.

Use Filter to specify a dataset filter. When filtering is applied to a dataset, only those records that meet a filter抯 conditions are available to an application. Filter contains the string that describes the filter condition. For example, the following filter condition displays only those records where the State field is 'CA' or 'MA':
State = 'CA' or State = 'MA'
To filter strings bases on partial comparisons, use an asterisk as a wildcard. For example:
State = 'M*'

Note: Applications can set Filter at runtime to change the filtering condition for a dataset at (for example, in response to user input).
 
不好意思,忘记换行了, 再贴一次
Use Filter to specify a dataset filter.
When filtering is applied to a dataset,
only those records that meet a filter抯
conditions are available to an application.
Filter contains the string that describes
the filter condition. For example, the
following filter condition displays only
those records where the State field is 'CA' or 'MA':

State = 'CA' or State = 'MA'

To filter strings bases on partial comparisons,
use an asterisk as a wildcard. For example:

State = 'M*'

Note: Applications can set Filter at runtime to
change the filtering condition for a dataset at
(for example, in response to user input).
 
老大,例子怎么给你?发过来?
先贴关键代码吧:
1.字符串:
title 是一个字符串字段,
filter里写: title = '王小波文集'
顺手把filtered选为true即可.
( 注意filterOption里的两个参数 )
 
2.时间:
date 是一个日期字段,
filter里写: DATE = '76-10-03'
顺手把filtered选为true即可.

 
回答问题1:
实数小数部分本来就是近视值。而双精度小数部分有15位,说已有了你这样的结果。如果要解决此问题,可用Format()控制打映格式。
如:Format('&8.1f',[n]);
或:Format('&*.*f',[8,1,n]);
 
回答zwyu问题1:可以用Currency类型,这是定点数据类型,专门用于算帐等高精度
运算。
提问 茶叶蛋:通缉令怎么不发了?
 
报告tqz,您3月8号的最后一句话我没看到,
现在我换了d4,马上开始编译...
 
to tqz: 程序正在阅读中,可以考虑另外加分!

to zwyu : 这可能是delphi的一个bug.
您可以用这条语句试试看:
showmessage(FloatToStrF(n, ffFixed, 0, 18));
(把输出小数点后固定为18位)
一点问题没有,这说明不是浮点加法问题,也不是
showmessage的问题.
 
1.我用四舍五入解决的;
2.其它也可以;
3.双击TTABLE/TQUERY,选择字段,按F11,在DISPLAY FORMAT中输入想要的东东
 
to 茶叶蛋 : 用showmessage(FloatToStrF(n, ffFixed, 0, 18));这语句
试后,发现加到10以前都正常,10以后0.1好象就不加了,真奇
怪,可能真是个bug,不过tqz的方法对我有效.非常你的帮助.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部