模数(%)适用于Decimal数据类型,但不适用于float或real。为什么?

时间:2012-03-06 09:09:20

标签: sql floating-point

为什么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在模运算符中不兼容。

4 个答案:

答案 0 :(得分:2)

如果您对文档有疑问?

MSDN documentation

  

dividend必须是其中任何一种数据类型的有效表达式   整数和货币数据类型类别,或数字数据   类型。

它表示整数,货币(金钱,小钱)和数字

因此,不支持十进制。文档说“数字在功能上与十进制相同”,但在某些上下文中可能有不同的含义,如此。

我想,float被视为数值数据类型,其中十进制不是

阅读data types。它有货币数据类型的信息。 (钱,小钱)

<强>更新

这是catagory wise data type list。您可以按照数字和金钱的链接查找其中的数据类型

答案 1 :(得分:1)

因为floatreal代表实数,所以可以在没有余数的情况下进行划分。模数的定义是:

a mod n = r,如果a = n*q + ranqr整数,对于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)。