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

取小數的奇異現象

答題得分者是:speedup
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-26 05:51:56 IP:61.70.xxx.xxx 未訂閱
看了本站上有很多人討論 float 取小數的與四捨五入的問題 一般如果要取整數則用 
d1:=234.5
trunc(d1 0.5),不能用 round或 roundto 等程式
但我如果要取小數一位,或二位該如何做呢?
我試著用如下的語法    d2:=StrtoFloat(FormatFloat('#.0',d1));
但我發現一個奇怪的現像
當 
  d1:=234.15 時 d2 會等於 234.2
  d1:=234.25 時 d2 會等於 234.3
  d1:=234.35 時 d2 會等於 234.3
  d1:=234.55 時 d2 會等於 234.5
不知為何會有這種不規則的情形,不知各位大大有人知道嗎?
或有其他解法    
如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-26 05:56:17 IP:61.70.xxx.xxx 未訂閱
對不起修正一下結果
  d1:=234.15 時 d2 會等於 234.2
  d1:=234.25 時 d2 會等於 234.3
  d1:=234.35 時 d2 會等於 234.3
  d1:=234.45 時 d2 會等於 234.4
  d1:=234.55 時 d2 會等於 234.6
如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-26 08:17:04 IP:210.65.xxx.xxx 未訂閱
Hi thomas0728,    請參考以下討論:    http://delphi.ktop.com.tw/topic.php?topic_id=21876 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-26 08:31:15 IP:61.70.xxx.xxx 未訂閱
不好意思 那篇我已看過,沒有我要的答案 站上所有討論 float 取小數的文章我應該都已看過 不知是我悟差,還是大大不了解我的意思 請指定明白點 謝謝 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-26 09:31:03 IP:218.168.xxx.xxx 未訂閱
引言:
d1:=234.5
trunc(d1 0.5),不能用 round或 roundto 等程式
但我如果要取小數一位,或二位該如何做呢?    
如果你取的小數不會超過4位d2建議用Currency型態可避免數值誤差 接著你可採用位移方式來達到小數一位的目的
 
var d2,X : currency;
    
begin
 d1:=234.15;
 X := 10;//到小數一位X為10,兩位X為20,餘依此類推
 d2 := trunc(d1 * X  0.5) /X;
end;    
混心雜欲 棄修身~唉
------
唉~
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-26 10:41:24 IP:211.75.xxx.xxx 未訂閱
果然是高手過招,就知有沒有 讚! 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-26 12:03:30 IP:211.75.xxx.xxx 未訂閱
speedup 大大不好意思 你的公式我用計算機算沒問題,但實際寫程式却有問題 測試如下
   (234.35*10) 0.5---->等於 2344.00
   floattostr(Trunc((234.35*10) 0.5))--->變成 2343 了
為什麼,謝謝
如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-26 12:28:24 IP:211.75.xxx.xxx 未訂閱
speedup 我試出來了 d2:=(234.35*10) 0.5 d2:=Trunc(d2)/10 這樣子就可以了 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-26 12:45:58 IP:218.168.xxx.xxx 未訂閱
引言:
   (234.35*10) 0.5---->等於 2344.00
   floattostr(Trunc((234.35*10) 0.5))--->變成 2343 了
為什麼,謝謝
因為234.35 用二進位去存會有數值誤差(電腦實際是存234.34999999..) 如果提前用d2 (Currency型態 )應可避免這種狀況 ..你已經試出來了 混心雜欲 棄修身~唉
------
唉~
系統時間:2024-11-22 9:16:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!