为什么modulo可以使用小数运行,但不能运行float / real MSDN表示“必须是整数和货币数据类型类别中任何一种数据类型的有效表达式,或数值数据类型。”为什么不浮动值,因为它是一个近似值?
--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
Msg 402,Level 16,State 1,Line 3 数值类型float和numeric在模运算符中不兼容。
答案 0 :(得分:2)
如果您对文档有疑问?
dividend必须是其中任何一种数据类型的有效表达式 整数和货币数据类型类别,或数字数据 类型。
它表示整数,货币(金钱,小钱)和数字
因此,不支持十进制。文档说“数字在功能上与十进制相同”,但在某些上下文中可能有不同的含义,如此。
我想,float被视为数值数据类型,其中十进制不是
阅读data types。它有货币数据类型的信息。 (钱,小钱)
<强>更新强>
这是catagory wise data type list。您可以按照数字和金钱的链接查找其中的数据类型
答案 1 :(得分:1)
因为float
和real
代表实数,所以可以在没有余数的情况下进行划分。模数的定义是:
a mod n = r
,如果a = n*q + r
,a
,n
,q
和r
是整数,对于r
的最小可能绝对值。
查找http://en.wikipedia.org/wiki/Modulo_operation
对于其他非整数但定点变量,可以找到模数的定义,因为两个定点值不能总是在没有余数的情况下进行划分。但是,通常你只想使用模数进行整数运算,否则你会得到不同的结果。
答案 2 :(得分:1)
这个限制可能是为了保护您免受意外结果的影响。当使用不精确的算术时,模运算往往会产生意想不到的结果。
整数和货币数字类型适用于精确算术,而二进制浮点数不合适。例如,您是否期望0.3%0.01准确地给出零,接近零的数字或接近0.01的数字?货币类型可以完全做到这一点。使用二进制浮点的结果更令人惊讶。
答案 3 :(得分:0)
你想在这里实现什么? Modulo是一个整数运算符,它计算整数除法的余数。
如果你希望1.25作为结果将pri
转换为整数,那么除法(这将给你1)乘以2并从pri
中减去结果(3.25 - ((3/2) )* 2)。