作者 主題: 請教T-SQL 小數位的問題  (閱讀 6443 次)

0 會員 與 1 訪客 正在閱讀本文。

redjack

  • 活潑的大學生
  • ***
  • 文章數: 426
    • 檢視個人資料
請教T-SQL 小數位的問題
« 於: 2011-09-20 09:53 »
如另一篇針對OLEDB 的發問,小弟正在寫一個用以回報產線人員生產績效的網站。
其中績效點數的計算是以單位時間內的(產值/標準產值)*10。
最後取小數點後一位進行四捨五入。

找了一些方法:
select [EE] = Convert(decimal(4,1),450*10.0/1440)
set @tResult =  ( convert(decimal(4,1),(450*10.0/1440)))
在QA裡都能得到正確的結果。
但是我寫成自訂函數時,所取得的值就會出錯了,以上例而言,結果應該是要3.1
但如果寫成函數或是直接寫進trigger 裡 , 在資料列裡的資料就會變成:3.0999999046325684
如果在函式裡沒有宣告float  長度的話:在資料列裡的資料就會變成:3.1000000000000001

請問該如果讓我到正確的3.1 而不需要有後面那串小數點呢

謝謝各位的指教。


« 上次編輯: 2011-09-20 13:41 由 redjack »
Knowledge is Power

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4033
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
Re: 請教T-SQL 小數位的問題
« 回覆 #1 於: 2011-09-21 08:19 »
我知道 php 類似情形的處理方式

之前我也有類似問題,後來是使用高精度浮點運算 function 才解決

php BC math ( http://tw2.php.net/manual/en/ref.bc.php )

----------------------

這個問題是出現在 Windows + php 的環境,其實我以前在 Linux + php 或 FreeBSD + php 都沒遇到過

遇到的時候會讓人一整個傻眼  @@a
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4033
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
Re: 請教T-SQL 小數位的問題
« 回覆 #2 於: 2011-09-21 08:51 »
提供一個類似的「知名錯誤」 Android 計算機 14.52-14.49=?

http://www.google.com.tw/#q=14.52-14.49&fp=1
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

redjack

  • 活潑的大學生
  • ***
  • 文章數: 426
    • 檢視個人資料
Re: 請教T-SQL 小數位的問題
« 回覆 #3 於: 2011-09-21 15:29 »
在看過那篇計算機問題後,小弟後來改用MONEY 在傳遞就至少OK了。
雖然小數點位數會是四位,但至少不會亂跑。
另外也發現:
宣告@t1, @t2 均為float;
但是這二個動作:
SELECT convert(decimal(8,3),round(10.0/2.4,3))
set @t1 = convert(decimal(8,3),round(10.0/2.4,3))
最終看到會是不同的數值:
前者 -> 4.167
@t1 -> 4.1669999999999998
用real 也一樣。

目前會先用四位來執行,等有需要的話再參考這篇,把money 小數點位數改成二位試試看:
http://www.qqgb.com/DataDB/MSSQL/Sql2000JiChu/DataDB_249578.html

謝謝前輩的指導 ^^

PS: 現在才注意到,第一篇的也試過ROUND,但是結果都不同,取到不同的位數,或是丟入的數值不一樣。
可能產出的結果就又會不符合預期。
« 上次編輯: 2011-09-22 09:59 由 redjack »
Knowledge is Power