2016-03-09 66 views
0

如果我只有小數點後的精度需要1或2位,我應該用floatdecimal(18,2)還是走?如果我只需要1或2位數的精度,浮點數是否比小數類型好?

有問題的數值代表薪水。

+5

工資 - 使用'DECIMAL/NUMERIC/MONEY'這是準確的數據類型,或者你會問像像http://stackoverflow.com/questions/35885812/mssql-decimal-sum-and-float-sum-difference – lad2025

+1

可能重複的[數值,浮點數和小數在sql服務器之間的差異](http://stackoverflow.com/questions/1056323/difference-between-numeric-float-and-decimal-in-sql-server) –

回答

2

您應該使用decimal類型或更好,money類型,這是特別適合這些需求。

您不應該使用float,因爲float是十進制值的近似表示形式。 參見MSDN文檔,爲什麼我們不應該使用floathere

float和real數據類型被稱爲近似數據類型。 float和real的行爲遵循關於近似數值數據類型的IEEE 754規範。 近似數字數據類型不存儲爲許多數字指定的確切值;他們存儲了一個非常接近的值。對於許多應用來說,指定值和存儲的近似值之間的微小差異並不明顯。有時候,差異變得明顯。

因爲float和實際數據類型的近似性,當需要精確數字行爲,如在財務應用程序,在涉及舍入,或相等檢查操作不使用這些數據類型。相反,使用整數,小數,金錢或smallmoney數據類型。

1

決定是否要使用二進制小數或十進制小數的主要問題不是準確性,真的。這是「我如何期待計算進行」。

您從decimal獲得的主要內容是您可以在紙張上用定點數字計算的東西。例如: -

13.22 
+ 7.3 
    ----- 
    20.52 

這不是真的decimalfloat更精確的(儘管它可以是爲好,對於某些應用)。問題在於它會在紙面上犯同樣的錯誤 - 這是十進制的十進制數字,而不是二進制。

還是以另一種思路,你的投入肯定是小數十進制數(通常,在一個字符串或此類)。所以如果你使用浮點數,你會得到十進制 - >二進制 - >計算 - >小數。二進制到十進制表示沒有信息丟失(和有限的二進制數可以在有限的十進制數精確表示),但解決這個問題的另一種方法是不正確的 - 甚至像0.1在二進制小數沒有有限表示(就像1/3沒有十進制小數的有限表示,但在基數6中工作正常)。

+0

只是想知道:做你知道兩者之間的任何性能差異(除了使用4個字節的浮點數而不是9個字節的十進制(18,2)這個小問題所提示的微小優點嗎? – Ralph

+0

@Ralph我上次檢查時,十進制小數的硬件支持仍然很少。通過使用非十進制數來模擬窄定點數可以非常容易,但我不知道MS SQL是否利用這一點。最後,這個問題從來沒有真正出現過 - 當你需要小數精度時,你需要小數精度 - 浮動根本不會削減它,不管它有多快可能是:) – Luaan

相關問題