2012-03-06 284 views
6

爲什麼模運行良好帶小數但不與浮子/真實它 MSDN狀態「必須在整數和貨幣數據類型類別,或數字數據類型數據類型中的任何一個的有效表達。」爲什麼不浮動值,因爲它是一個近似值?Modulo(%)與Decimal數據類型一起使用,但不與float或real一起使用。爲什麼?

--Runs fine 
declare @pri decimal 
set @pri = 3.25 
select @pri%2 

結果1

--Gives an error 402 
declare @pri float 
set @pri = 3.25 
select @pri%2 

消息402,級別16,狀態1,第3行 類型float的數據和數字是模運算符不兼容。

+0

您使用的是哪個版本的SQL Server?第一個在SQL Server 2000中也給我一個錯誤。 – 2012-03-06 09:23:41

+0

雖然我不能肯定地說,但我認爲你是正確的,你從二進制IEEE754類型(float和double precision)中得到的舍入誤差使得語言設計者禁止對它們進行模數。使用數字和小數可以指定精度和比例。這只是一個猜測,但是,例如,JavaScript和C很樂意讓你使用浮點數和雙精度浮點數(當然是C語言中的「fmod」)。 – 2012-03-06 09:27:35

+0

@Ocaso Protal:這是因爲第一個嘗試用浮點數初始化一個固定點變量。 – vsz 2012-03-06 09:27:55

回答

2

如果您對文檔的問題?

MSDN documentation

分紅必須是數據類型中的任何一個的有效表達 整數和貨幣數據類型類別,或數字數據 類型。

它說,整數,貨幣(金錢,SMALLMONEY)和數字

因此,不支持小數。文檔中說「數字在功能上與小數相同」,但在某些情況下,它可能與此有不同含義。

我想,浮被視爲數字類型,其中爲十進制不是

閱讀data types。它有關於貨幣數據類型的信息。(錢,SMALLMONEY)

更新:

這裏是catagory wise data type list。您可以按照指向數字和金錢的鏈接查找其中的數據類型

1

因爲floatreal代表實數,它們總是可以不加餘數地分開。模的定義是:

a mod n = r,如果a = n*q + r,其中anqr整數,爲r儘可能小的絕對值。

查找http://en.wikipedia.org/wiki/Modulo_operation

對於其他的,非整數,但定點變量模的定義,可以發現,由於兩個固定點值不能總是沒有餘數。但是,通常你只想用整數運算模數,否則你會得到不同的結果。

+1

@Martin Smith:正是我所說的。實數(例如浮點數)可以無餘數地分開,這就是爲什麼modulo沒有爲它們定義。 – vsz 2012-03-06 09:47:56

0

你想在這裏實現什麼? Modulo是一個整數運算符,它計算整數除法的其餘部分。

如果您預計1.25爲結果轉換pri爲整數,做除法(這會給你1)乘以2減去pri(3.25的結果 - ((3/2)* 2)

+0

此問題與我的業務需求無關。這完全是關於理解概念的。 – 2012-03-06 10:01:13

1

也許該限制旨在保護您免受意外結果的影響。與不精確的算術一起使用時,模運算往往會給出非常意想不到的結果。

整數和貨幣數字類型適用於精確算術,而二進制浮點不適合。例如,您是否期望0.3%0.01能給出恰好爲零,接近零的數字或接近0.01的數字?貨幣類型可以完全做到這一點。使用二進制浮點的結果更令人驚訝。

相關問題