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

不知該說是進制還是進位的問題 ..

答題得分者是:aip999
cavy9999
一般會員


發表:16
回覆:21
積分:7
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-08 22:16:51 IP:61.64.xxx.xxx 未訂閱
想破頭,為了一個很奇怪的演算法.. 目前好像都是使用十進制了. 頂多是四捨五入,或無條件進入/捨去. 不知 delphi 是否有5進制的函式呢..或如何達成. 例如: 無條件進入法. 10 -> 10 12 -> 15 15 -> 15 17 -> 20 無條件捨去法. 10 -> 10 12 -> 10 15 -> 15 17 -> 15 也就是說,尾數不是5就是0,當然是0的話還是要進位的. 感恩.. 所有看此討論文章的人.
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-08 23:28:42 IP:211.76.xxx.xxx 未訂閱
cavy9999 您好:    底下程式碼您參考看看!其實也可以用if-else來判斷!    
.....    function addIn(value :integer) : integer;
var
   n : integer;
begin
  n := value mod 10;  // 個位數字
  if ( (n=0) or (n=5) ) then exit; // 0 or 5      value := value - n;
  if ( n>5 ) then n:=10
  else n:=5;      result := value   n;
end;    function removeOut(value :integer) : integer;
var
   n : integer;
begin
  n := value mod 10;    // 個位數字
  if ( (n=0) or (n=5) ) then exit;  // 0 or 5      value := value - n;
  if ( n>5 ) then n:=5
  else n:=0;      result := value   n;
end;    procedure TForm1.Button1Click(Sender: TObject);
var
   value : integer;
begin
  value := StrToInt(Edit1.Text);
  value := addIn(value);
  Label1.Caption := IntToStr( value );      value := StrToInt(Edit1.Text);
  value := removeOut(value);
  Label2.Caption := IntToStr( value );
end;    .....
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-09 00:21:30 IP:220.132.xxx.xxx 未訂閱
將 richtop兄的程式再簡化一點, 效能也更高一點的作法,    
function Round5In(aValue: Integer): Integer;
var
  r: Integer;
begin
  r := aValue mod 5;
  if r = 0 then
    Result := aValue
  else
    Result := aValue   5 - r;
end;    function Round5Out(aValue: Integer): Integer;
var
  r: Integer;
begin
  r := aValue mod 5;
  if r = 0 then
    Result := aValue
  else
    Result := aValue - r;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Round5In(12)));
  ShowMessage(IntToStr(Round5Out(13)));
end;
cavy9999
一般會員


發表:16
回覆:21
積分:7
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-09 00:32:03 IP:61.64.xxx.xxx 未訂閱
RichTop 大哥 您好. 感謝您夜深裡的一盞燈. 但假設這是個浮點數值 333.3 就不行了. 難道說 delphi 真的沒有好用的函式了.. 謝謝 !        
引言: cavy9999 您好: 底下程式碼您參考看看!其實也可以用if-else來判斷!
.....    function addIn(value :integer) : integer;
var
   n : integer;
begin
  n := value mod 10;  // 個位數字
  if ( (n=0) or (n=5) ) then exit; // 0 or 5      value := value - n;
  if ( n>5 ) then n:=10
  else n:=5;      result := value   n;
end;    function removeOut(value :integer) : integer;
var
   n : integer;
begin
  n := value mod 10;    // 個位數字
  if ( (n=0) or (n=5) ) then exit;  // 0 or 5      value := value - n;
  if ( n>5 ) then n:=5
  else n:=0;      result := value   n;
end;    procedure TForm1.Button1Click(Sender: TObject);
var
   value : integer;
begin
  value := StrToInt(Edit1.Text);
  value := addIn(value);
  Label1.Caption := IntToStr( value );      value := StrToInt(Edit1.Text);
  value := removeOut(value);
  Label2.Caption := IntToStr( value );
end;    .....
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
cavy9999
一般會員


發表:16
回覆:21
積分:7
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-09 00:46:40 IP:61.64.xxx.xxx 未訂閱
timhuang 您真是太瞭解一個程式中..效率問題. 為求謹慎,我還是必須需要連浮點數值都考慮進來.    
引言: 將 richtop兄的程式再簡化一點, 效能也更高一點的作法,
function Round5In(aValue: Integer): Integer;
var
  r: Integer;
begin
  r := aValue mod 5;
  if r = 0 then
    Result := aValue
  else
    Result := aValue   5 - r;
end;    function Round5Out(aValue: Integer): Integer;
var
  r: Integer;
begin
  r := aValue mod 5;
  if r = 0 then
    Result := aValue
  else
    Result := aValue - r;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Round5In(12)));
  ShowMessage(IntToStr(Round5Out(13)));
end;
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-09 13:59:33 IP:211.76.xxx.xxx 未訂閱
cavy9999 您好: 回答問題時,因為希望能明載程式寫作思路,所以就多了些步驟。 感謝 timhuang 的簡化與效率提昇! 其實我當時想的解法是利用if-else-if來判斷,但又想將它寫成一個function,所以就成了上述有點怪怪的寫法!精確的說有點錯(我修改了一下)! 如果要考慮浮點數,那必須要告知function在小數點後第幾位。 例如:333.3 * 10 = 3333 => 3335 => 3335/10 = 333.5 不過浮點數的除法有時會引進捨去誤差,所以可能在小數點後很多位處會出現無法預期的數字! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-09 20:33:37 IP:218.162.xxx.xxx 未訂閱
不是5 就是0 以整數無條件進位用(value 4) div 5 * 5 無條件捨去法用value div 5 * 5 就會是你想要的 夠簡單? 要用小數可以配合函數int 跟Round
系統時間:2024-07-03 3:02:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!