CnPack Forum


 
Subject: SQL里面Float,Money、Decimal
jAmEs_
灌水部部长
Rank: 8Rank: 8



Medal No.1  
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
Post at 2007-5-31 15:32  Profile | Blog | P.M. 
SQL里面Float,Money、Decimal

以前浮點的近似值問題一直困擾著我,后來我知道Decimal可以表示精確的浮點,而Float近似值表示法會代“尾巴”,開始以為問題解決了,今天我發現錯了。。。
測試建立一個表:
create table floattest
(
   dec_col dec(10,1),
   money_col smallmoney,
   float_col float,
)
通過程序插入一些記錄,我通過RoundTo函數把浮點處理剩下1位小數。增加幾條記錄后,我再重新打開這個表,我以為
FieldByName('dec_col').AsFloat = RoundTo(FieldByName('dec_col').AsFloat, -1)
結果錯了,不等的。
而竟然:
FieldByName('float_col').AsFloat = RoundTo(FieldByName('float_col').AsFloat, -1)
網上資料不是說Decimal可以表示精確的值嗎?怎么不行呢?有沒有人知道怎么回事?
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-5-31 16:27  Profile | Blog | P.M.  | QQ
"Decimal可以表示精確的浮點"是指定点浮点数。
浮点数本身就不是精确的。
Delphi 能表示 18 位浮点数小数, 超了要用科学计数法。

Decimal 是 9 个字节,
Float 是 8 个字节。
FieldByName('dec_col').AsFloat 将定点浮点数 Decimal 转为 FLoat 时,会损失一个字节的精度。

你的浮点数比较 FieldByName('dec_col').AsFloat = RoundTo(FieldByName('dec_col').AsFloat, -1), 不能这样比较阿




一壶清茶煮青春.
Top
jAmEs_
灌水部部长
Rank: 8Rank: 8



Medal No.1  
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
Post at 2007-5-31 17:05  Profile | Blog | P.M. 
我剛才找了些資料,其實應該是因為AsFloat又把精確的值變成近似值。也就是,雖然SQL里面有Dec這樣的精確類型,但是Delphi卻沒有對于的類型。

至於你說的:
Decimal 是 9 个字节,
Float 是 8 个字节。
FieldByName('dec_col').AsFloat 将定点浮点数 Decimal 转为 FLoat 时,会损失一个字节的精度。
好像不是這樣吧。。。其實我用DEC(5,1),DEC就編程5字節了。然后再測試,還是不會得出精確的數值。

其實是我之前理解錯誤了一個地方,我當時認為RoundTo以后就是精確的,其實,RoundTo以后,它依然是浮點,也是不精確的。。。

總之,浮點就是不適宜用<>和=來比較。

不過,為何double就是不能表達精確的東東呢。。。也就是RoundTo以后,為何它還要保留“尾巴”,難道這個是CPU的浮點計算一定要這樣?哪怕是
d := 2.1;
這樣的運算,也會給帶上“尾巴”。
Top
jAmEs_
灌水部部长
Rank: 8Rank: 8



Medal No.1  
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
Post at 2007-5-31 17:55  Profile | Blog | P.M. 
說實在,除不盡的時候,帶“尾巴”也正常,但是除的盡也帶,實在是覺得奇怪,為何要這樣?哪位高人指點一下~~
Top
 




All times are GMT++8, the time now is 2024-5-7 19:21

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.006074 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP