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
爲什麼第二個查詢不返回相同的作爲第一名的東西?
比方說,我有以下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
爲什麼第二個查詢不返回相同的作爲第一名的東西?
二進制浮點類型(如實數和浮點數)不能準確地表示十進制數。特別是不能將0.3存儲爲二進制浮點數。而是存儲一個非常接近0.3的數字。這被稱爲表示錯誤。
由於實際和浮點的誤差大小不同,因爲它們具有不同的精度。
如果要更準確地存儲小數,請考慮使用decimal or numeric。但請注意,即使這些類型可以精確地存儲十進制值達到一定數量的數字,計算仍然可以產生無法精確表示的數字。例如,0.1/0.3
的結果不能完全存儲在decimal
中,即使0.1
和0.3
都可以。在這種情況下,結果將舍入到可以存儲在該類型中的最接近的值(例如,取決於精度的0.333333333
)。
是的,就像1/3是一個十進制循環數(0.333333 ..永遠),它也在二進制循環:0.01010101010101 ---永遠。但是,一些十進制非重複數字(如0.1)以二進制形式重複出現。例如。 0.1dec = 0.0001100110011 ...永遠在二進制中,因此不能完全表示。 – DaveBoltman