線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1000
推到 Plurk!
推到 Facebook!

数字显示相等,但提示不等

答題得分者是:pgdennis
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-19 00:50:10 IP:219.140.xxx.xxx 未訂閱
dbgrid1用于显示数据库某表 该表中数字信息为money型  stringgrid1用于显示统计结果并计算是否相等 cal1,cal2分别用于统计 预算和实际支出 按以下代码实施后 stringgrid1中数字显示相等 但stringgrid1.Cells[1,1]却提示不等 不知怎么回事???
 
procedure TSum.sumtable;
var
count,i:integer;
cal1,cal2:double;
begin
 //计算表中的记录数
count:=datasource1.DataSet.RecordCount;
//统计信息,判断是否相等
cal1:=0;
cal2:=0;
while not datasource1.DataSet.Eof do
 begin
  cal1:=strtofloat(dbgrid1.Fields[2].Text) cal1;
  cal2:=strtofloat(dbgrid1.Fields[3].Text) cal2;
  datasource1.DataSet.Next;
 end;
//显示统计结果
stringgrid1.Cells[1,1]:='是否相等';
stringgrid1.Cells[2,1]:=floattostr(cal1);
stringgrid1.Cells[3,1]:=floattostr(cal2);
//问题出现了...
if (cal1<>cal2) then
 begin
 stringgrid1.Cells[1,1]:='不相等';
 stringgrid1.Font.Color:=clred;
 end
 else
 stringgrid1.Cells[1,1]:='相等';
end;
这里 stringgrid1中数字显示相等 但stringgrid1.Cells[1,1]却提示不等 且红体 后来 我把“//问题出现了..”后面的代码改为
if (cal1=cal2) then
 begin
 stringgrid1.Cells[1,1]:='相等';
 end
 else
  stringgrid1.Cells[1,1]:='不相等';
 stringgrid1.Font.Color:=clred;    end;
//显示相等 但红体 
请问各位大大 这到底是怎么回事? 發表人 - baby2321 於 2005/10/19 00:55:27
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-19 10:04:01 IP:221.226.xxx.xxx 未訂閱
您不妨这样试试:    
if (cal1=cal2) then
 begin
 stringgrid1.Cells[1,1]:='相等';
 end
 else
  stringgrid1.Cells[1,1]:='不相等';
 stringgrid1.Font.Color:=clred;
这一句被你抛在IF结构体之外,所以不管IF结果如何,都会触发。    试试这样写:
if (cal1=cal2) then
begin
  stringgrid1.Cells[1,1]:='相等';
end
else
begin
  stringgrid1.Cells[1,1]:='不相等';
  stringgrid1.Font.Color:=clred;
end;
建议多使用Begin/End对程序段进行包裹,开始学习时不要讲求程序缩写这些技巧,很容易出错,等熟练了并且明确知道程序运作流程,就可以讲究一些写法技巧了。
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-19 10:04:21 IP:221.226.xxx.xxx 未訂閱
不好意思,多按了一下~  發表人 -
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-19 11:07:15 IP:219.140.xxx.xxx 未訂閱
多谢Vicen回复    可是为什么  
 
if (cal1<>cal2) then
 begin
 stringgrid1.Cells[1,1]:='不相等';
 stringgrid1.Font.Color:=clred;
 end
 else
 stringgrid1.Cells[1,1]:='相等';
end;
在数字显示相等的情况下 stringgrid1.Cells[1,1]却提示不等???
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-19 13:13:33 IP:221.226.xxx.xxx 未訂閱
其实这个我也不太清楚,我这里没有发现这个问题,你那边试试下面这种写法呢?    
  if Not (cal1=cal2) then
  begin
    stringgrid1.Cells[1,1]:='不相等';
    stringgrid1.Font.Color:=clred;
  end
  else
  begin
    stringgrid1.Cells[1,1]:='相等';
  end;
end;
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-19 14:08:22 IP:219.140.xxx.xxx 未訂閱
 if (cal1<>cal2) then
 begin
 stringgrid1.Cells[1,1]:='不相等';
 stringgrid1.Font.Color:=clred;
 end
 else
 stringgrid1.Cells[1,1]:='相等';
end;    //在数字显示相等的情况下 stringgrid1.Cells[1,1]却提示不等???
我用上面的写法测试数据 奇怪的是 有时显示正确 有时又有问题 自己也不知道具体什么原因 现在显示又是正确的了 阁下的写法肯定是对的 我再试试 如果还是有问题 就只好改成“肯定”格式了
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-19 16:19:19 IP:218.163.xxx.xxx 未訂閱
請記住一件事,Double等浮點型態之變數,請不要用IF A=B 直接比較....... 有時會有不想等的情形,如果變數是有小數點的話,那可以直接用 FloatToStr()先轉成Str再作比較,這樣就不會遇到你的問題了 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-19 17:28:57 IP:221.226.xxx.xxx 未訂閱
請記住一件事,Double等浮點型態之變數,請不要用IF A=B 其实不太看的明白,兄弟能否解释一下,我们公司有几个程序也用到Double形态直接对比,确从未出现过问题。 FloatToStr先作转换,实在看不明白,我们举个例子看一下,我们默认Double型变量有变数的可能,但FloatToStr转换的还不是变过的数值吗?难道数值在变动后FloatToStr转换的会保持原来的数值? 小弟无意辩驳pgdennis的意见,只是想搞明白这个道理,避免以后再犯同类错误。
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-19 18:52:16 IP:211.74.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
var
 F1:double;
 F2:double;
begin
 F1:=0.9999999999999994;
 F2:=0.9999999999999993;
 Edit1.Text:=floatTostr(F1);
 Edit2.Text:=floatTostr(F2);
 if F1=F2 then
   ShowMessage('相等')
 else
   ShowMessage('不相等');
end;
如果已經確定小數點會精確到第幾位數,那用double也沒什好顧慮的 如果不確定...那就要小心點,有可能會發生上面的情形 FloatToStr()並不能處理比Double更多位數... 上面的例子會發現顯示的結果是一樣的 但是兩變數相比較,是不一樣的 星期一,星期二...星期日..星期一..無窮迴圈@@
------
星期一,二...無窮迴圈@@
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-19 20:13:32 IP:221.226.xxx.xxx 未訂閱
谢谢pgdennis兄,又长了一些知识,真是天外有天人外有人啊~ 我又看了一下我们的程式,已经对小数位数进行了处理,所以不会有这个问题,建议baby2321兄不妨将小数位数处理到小数点后3-4位,在一般预算中足够用了。
baby2321
初階會員


發表:52
回覆:165
積分:48
註冊:2005-06-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-20 06:30:56 IP:219.140.xxx.xxx 未訂閱
感谢pgdennis的精辟讲解 如果我改为  
 
procedure TForm1.Button1Click(Sender: TObject);
var
 F1:double;
 F2:double;
begin
 F1:=0.9999999999999994;
 F2:=0.9999999999999993;
 Edit1.Text:=floatTostr(F1);
 Edit2.Text:=floatTostr(F2);
 if Edit1.Text<>Edit2.Text2 then
   ShowMessage('不相等')
 else
   ShowMessage('相等');
end;
即直接利用字符串比较 是不是要好一些 我在原来的代码中把比较方式调整为 字符串的比较 可以实现预期效果 發表人 - baby2321 於 2005/10/20 06:35:18
系統時間:2024-06-26 9:57:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!