var b17,b18,b19,b20,b21:double;
begin
b17:=strtofloat(DBEditEh29.Text);
b18:=strtofloat(DBEditEh30.Text);
b19:=strtofloat(DBEditEh31.Text);
b20:=strtofloat(DBEditEh32.Text);
b21:=strtofloat(DBEditEh33.Text);
if b17 < (b18+b19+b20+b21) then showmessage('数据不对?');
end;
我的核心程序就这几行。
但是到执行的时候,整数可以,带小数的就不对了。
比如输入 100.85 10.05 40.2 40.2 10.4
100.85=10.05+40.2+40.2+10.4就应该是恒等式,不会有问题啊。
但是老是弹出对话筐,说数据不对。郁闷。
那位兄弟帮我看看,是什么问题呢?
begin
b17:=strtofloat(DBEditEh29.Text);
b18:=strtofloat(DBEditEh30.Text);
b19:=strtofloat(DBEditEh31.Text);
b20:=strtofloat(DBEditEh32.Text);
b21:=strtofloat(DBEditEh33.Text);
if b17 < (b18+b19+b20+b21) then showmessage('数据不对?');
end;
我的核心程序就这几行。
但是到执行的时候,整数可以,带小数的就不对了。
比如输入 100.85 10.05 40.2 40.2 10.4
100.85=10.05+40.2+40.2+10.4就应该是恒等式,不会有问题啊。
但是老是弹出对话筐,说数据不对。郁闷。
那位兄弟帮我看看,是什么问题呢?
解决方案 »
- 各位老大,delphi流分为哪几种啊
- combox通过adoquery读取数据库不显示数据
- 如何判断Popupmenu当前是否处于活动状态?
- 我用webbrowser做的客户端浏览,发现运行一段时间之后,程序占用内存一直增加,想问下如何释放内存
- D6居然在双核电脑上不能run?
- 小弟跪求有复选匡的TreeView控件,请各位大虾介绍一下。
- 在listview中如何实现类示treeview那种--子列表功能
- 感兴趣吗?进来看一看;如何做保存操作?(同时希望 forgot2000 (忘记2000年)能过一个快乐的生日),进者有分
- 动态创建QUICKREP一个小的问题,急急急!!!
- image1.pictur.icon:=hicn1,image1显示后如何清空它?
- 远程教育项目招聘程序员
- Image组件能显示一个指定地址gif吗?比如:http://expert.csdn.net/images/csdn.gif
const
nEQUAL = 1E-6;
var
dblTemp: Double;
begin
dblTemp := (10.06 + 40.2 + 40.2 + 10.4);
if dblTemp - 100.85 > nEQUAL then
ShowMessage('Please enter again!! ');
end;
swayi21(微斯人)也可以。
但是,我还不明白comp是什么类型哦,pascal的类型好象没见过这类型哦。
and compare float&double data using if(fabs(a-b)<1e-8)
< and > has the same question.
而你定义的 b17,b18,b19,b20,b21变量是double类型,
Extended在系统中占用10字节,而Double只占用8字节。
当你将Extende数据类型的值赋给Double型变量时,系统会强制类型转换,
转换过程中,将产生误差。
所以你只要将b17,b18,b19,b20,b21定义为Extended类型即可。
是数据精度问题,在d6中我将数据类型改为currency即可,其他数据类型不行!
我还用过别的法子,当然要知道需要精确到小数点后几位了,然后把这些值乘以10的n次方
然后再转化为整数进行比较,这样就很方便了。
var b17,b18,b19,b20,b21:double;
begin
b17:=strtofloat(DBEditEh29.Text);
b18:=strtofloat(DBEditEh30.Text);
b19:=strtofloat(DBEditEh31.Text);
b20:=strtofloat(DBEditEh32.Text);
b21:=strtofloat(DBEditEh33.Text);
if Trunc(b17*100)<Trunc((b18+b19+b20+b21)*100) then showmessage('数据不对?');
end;
但在机器中却是该类型数据的统一长度,如4.0,其实是4.0xxxxxxx……,有许多不可见
部分。当你进行计算时,有时结果是不可知的(相对准确);我曾经用浮点数运算后进行大
小比较,但怎么也不对,后来想办法转成整形的才通过。你可能遇到的也是此类问题。
你可以人为的控制数据精度,如截取小数点后5位。delphi中有这样的函数(dataformat)
procedure TForm1.Button1Click(Sender: TObject);
var
aa,bb:double;
cc:String;
begin
aa:=26;
bb:=25.6;
cc:=floattostr(aa-bb);
showmessage(cc);
end;
它的结果就不是0.4而是3.9999999999999。
"="号是绝对不能用的,应该用两个值相减的绝对值小于某个值来比较.