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

應該是型態的問題吧

尚未結案
kool0318
一般會員


發表:14
回覆:17
積分:6
註冊:2005-01-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-15 16:06:26 IP:220.130.xxx.xxx 未訂閱
var a,b,c,d Double; e:integer; d:=(a-b)*c*1000; if Pos('.', FloatToStr( d )) > 0 then e:=e StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1)) else e:=e StrToInt(Copy(FloatToStr (d), 1, MAXINT)); 請教各位專家,當d值為浮點數時一切正常 但是當d值是整數時,到下方if判斷式時為什麼是執行 e:=e StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1)) 而不是 e:=e StrToInt(Copy(FloatToStr (d), 1, MAXINT)); 而且經過 StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1)) 運算後d值會少1 請問如何解決 謝謝
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-15 16:45:25 IP:220.130.xxx.xxx 未訂閱
引言:
var
 a,b,c,d   Double;
 e:integer; 
 d:=(a-b)*c*1000;    if Pos('.', FloatToStr( d )) > 0 then
  //e:=e  StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1))
  e:=e  StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d))-1))
else
  e:=e  StrToInt(Copy(FloatToStr (d), 1, MAXINT));
請教各位專家,當d值為浮點數時一切正常 但是當d值是整數時,到下方if判斷式時為什麼是執行 e:=e StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1)) 而不是 e:=e StrToInt(Copy(FloatToStr (d), 1, MAXINT)); 而且經過 StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d)-1)) 運算後d值會少1 請問如何解決 謝謝
程式是不是少個)?? 還有就是我測試了一下, 並沒有你說的哪種情形說! 以下是我測試的程式碼
procedure TForm1.Button1Click(Sender: TObject);
Var
 a,b,c,d:double;
 i:integer;
begin
 a:=2.1;
 b:=1.1;
 c:=3.1;
 d:=(a-b)*c*1000;
 if pos('.',floattostr(d))>0 then
 i:=strtoint(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d))-1))
 else
 i:=strtoint(Copy(FloatToStr(d), 1, MAXINT));
 showmessage(inttostr(i));
end;
Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-15 16:50:39 IP:219.68.xxx.xxx 未訂閱
我測試也是正常 (少個)) 不過我想紅色那行應該就可以達到你要的功能
var
  a,b,c,d: Double;
  e:integer;
begin
  a:=5.469;
  b:=2.541;
  c:=1.2;
  d:=(a-b)*c*1000;
  e:=0;
  {
  if Pos('.', FloatToStr( d )) > 0 then
    e:=e  StrToInt(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d))-1))
  else
    e:=e  StrToInt(Copy(FloatToStr (d), 1, MAXINT));
  }
  e:=e Trunc(d);
  Showmessage(IntToStr(e));    
@瞭解越多.懂得越少@
kool0318
一般會員


發表:14
回覆:17
積分:6
註冊:2005-01-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-15 16:55:26 IP:220.130.xxx.xxx 未訂閱
對 不好意思我漏打一個) 我的 a:=20.5; b:=20.1125; c:=2; e:=-60762 所以 d=775 但是運算後d就變成774,e:=-606,988(正確是-606987)
kool0318
一般會員


發表:14
回覆:17
積分:6
註冊:2005-01-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-15 16:59:25 IP:220.130.xxx.xxx 未訂閱
trunc(d)我也試過了會變成774
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-15 17:47:39 IP:220.130.xxx.xxx 未訂閱
嗯...找到原因了 參考這篇解答 因為所有的float type 在Delphi中都是由Extended 這種型態組成 http://groups.google.com.tw/groups?hl=zh-TW&lr=&rls=GGLD,GGLD:2003-50,GGLD:zh-TW&frame=right&th=596130cb29ea4171&seekm=LK86WCANJQY3EwEV 所以你要得到775,將你的變數宣告成extended在運算的時候就會得到正確的值
procedure TForm1.Button1Click(Sender: TObject);
Var
 a,b,c,d:extended;
 i,e:integer;
 s:string;
begin
 a:=20.5;
 b:=20.1125;
 c:=2;
 d:=(a-b)*c*1000;
 if pos('.',floattostr(d))>0 then
 e:=strtoint(Copy(FloatToStr(d), 1, Pos('.', FloatToStr(d))-1))
 else
 e:=strtoint(Copy(FloatToStr(d), 1, MAXINT));
 showmessage(inttostr(e));
end;
Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
kool0318
一般會員


發表:14
回覆:17
積分:6
註冊:2005-01-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-16 08:20:12 IP:210.68.xxx.xxx 未訂閱
感謝各位高手的回答,終於解決困擾已久的問題
系統時間:2024-05-21 19:34:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!