2012-05-22 16 views
7

比方說,我有以下2個查詢:SQL真正VS浮動

select sum(cast(2666 as float)) * cast(.3 as float) 
select sum(cast(2666 as real)) * cast(.3 as real) 

首屆查詢返回:799.8
第二屆查詢返回:799.800031781197

爲什麼第二個查詢不返回相同的作爲第一名的東西?

回答

18

二進制浮點類型(如實數和浮點數)不能準確地表示十進制數。特別是不能將0.3存儲爲二進制浮點數。而是存儲一個非常接近0.3的數字。這被稱爲表示錯誤。

由於實際和浮點的誤差大小不同,因爲它們具有不同的精度。

如果要更準確地存儲小數,請考慮使用decimal or numeric。但請注意,即使這些類型可以精確地存儲十進制值達到一定數量的數字,計算仍然可以產生無法精確表示的數字。例如,0.1/0.3的結果不能完全存儲在decimal中,即使0.10.3都可以。在這種情況下,結果將舍入到可以存儲在該類型中的最接近的值(例如,取決於精度的0.333333333)。

+2

是的,就像1/3是一個十進制循環數(0.333333 ..永遠),它也在二進制循環:0.01010101010101 ---永遠。但是,一些十進制非重複數字(如0.1)以二進制形式重複出現。例如。 0.1dec = 0.0001100110011 ...永遠在二進制中,因此不能完全表示。 – DaveBoltman