請問int的正確用法 |
答題得分者是:Stallion
|
todaynow
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2007-04-24 發送簡訊給我 |
各位大大:
遇到一個很怪的東西…麻煩幫忙解一下 procedure TForm1.Button1Click(Sender: TObject); var k,Result:Real; begin k:=3.21; result:=int(k*100); showmessage(FloatToStr(result)); end; 得到的答案竟然變成320(應該是321才對吧!??)
------
************************** 努力在delphi的世界中...... |
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
Stallion
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
這牽扯到浮點數在與整數運算前,Compiler捨去浮點數位數(捨位的算法又有不同),所以在運算前Programmer要自行轉換與指定精度!
<textarea cols="60" rows="10" class="delphi" name="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,Math, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var k,Result:Real; begin k:=3.21; SetRoundMode(rmUp); //說明太長,請自行查線上說明 Result:=int(Roundto(k,-2)*100); //RoundTo請自行查線上說明 Showmessage(FloatToStr(Result)); end; end. </textarea> ===================引 用 todaynow 文 章=================== 各位大大: 遇到一個很怪的東西…麻煩幫忙解一下 procedure TForm1.Button1Click(Sender: TObject); var k,Result:Real; begin k:=3.21; result:=int(k*100); showmessage(FloatToStr(result)); end; 得到的答案竟然變成320(應該是321才對吧!??) |
todaynow
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2007-04-24 發送簡訊給我 |
|
todaynow
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2007-04-24 發送簡訊給我 |
各位大大:
不好意思吶~~ 後來又有一個奇怪的問題發生了~~ 照理說因為浮點數有誤差所以應該每次都會有問題,但為什麼有時候又是正常的呢? 舉例: procedure TForm1.Button1Click(Sender: TObject); var k,Result:Real; begin k:=3.21; result:=int(k*100); showmessage(FloatToStr(result)); end; result的值有時候會是因浮點數而產生誤差的320 但有時候又會是我想要的321 不知道是什麼原因會造成這樣的結果呢? 再麻煩各位大大了… 謝謝
------
************************** 努力在delphi的世界中...... |
Stallion
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
你沒有去看上面的函數說明對不對?
![]() 先以裡面RoundTo確定數值的精度,以免跟整數運算時精度被Compiler不預期的縮減了。 一案一問,不要把問題拉的太長了~OK!先結案吧! ===================引 用 todaynow 文 章=================== 各位大大: 不好意思吶~~ 後來又有一個奇怪的問題發生了~~ 照理說因為浮點數有誤差所以應該每次都會有問題,但為什麼有時候又是正常的呢? 舉例: procedure TForm1.Button1Click(Sender: TObject); var k,Result:Real; begin k:=3.21; result:=int(k*100); showmessage(FloatToStr(result)); end; result的值有時候會是因浮點數而產生誤差的320 但有時候又會是我想要的321 不知道是什麼原因會造成這樣的結果呢? 再麻煩各位大大了… 謝謝 |
todaynow
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2007-04-24 發送簡訊給我 |
是~~大大,我是已經結案了~
但是關於SetRoundMode和Roundto,我按F1想找說明可是沒有(是因為我用的是DELPHI5的關系嗎?) 但還是有上網查了資料,知道了它的用法~~ 但我要以大大給的範例RUN的時候會出現找不到Variants.DCU 的錯誤訊息,也是因為版本的關系嗎? 如果要能用SetRoundMode和Roundto是不是要先要有Variants.DCU呢?
------
************************** 努力在delphi的世界中...... |
Stallion
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
還沒結案吧!不會結案嗎?看看這裡~
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=88169 Delphi5我沒用過,我是用Delphi7,查詢關鍵字的方法,是將滑鼠游標停留在想要查的方法或函數上面,然後才按F1。 ===================引 用 todaynow 文 章=================== 是~~大大,我是已經結案了~ 但是關於SetRoundMode和Roundto,我按F1想找說明可是沒有(是因為我用的是DELPHI5的關系嗎?) 但還是有上網查了資料,知道了它的用法~~ 但我要以大大給的範例RUN的時候會出現找不到Variants.DCU 的錯誤訊息,也是因為版本的關系嗎? 如果要能用SetRoundMode和Roundto是不是要先要有Variants.DCU呢? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |