Modulo(%)适用于Decimal数据类型,但不适用于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

消息402,级别16,状态1,第3行float和numeric数据类型在模运算符中不兼容。

如果您对文档有任何疑问?

MSDN文档

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

它表示整数、货币(货币、小额货币)和数字

因此,不支持十进制。文档中说"数字在功能上与十进制相同",但在像这样的上下文中可能有不同的含义。

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

读取数据类型。它包含有关货币数据类型的信息。(货币,小额货币)

更新:

以下是分类数据类型列表。您可以按照数字和货币的链接查找其中的数据类型

您想在这里实现什么?模是一个整数运算符,它计算整数除法的余数。

如果您期望1.25作为结果,则将pri转换为整数,进行除法运算(这将得到1)乘以2,然后从pri中减去结果(3.25-((3/2)*2)。

也许限制是为了保护您免受意外结果的影响。当与不精确的算术一起使用时,模运算往往会产生出乎意料的结果。

整数和货币数字类型适用于精确算术,而二进制浮点则不适用。例如,你希望0.3%0.01给你一个恰好为零的数字,一个接近零的数字还是一个接近0.01的数字?货币类型恰恰可以做到这一点。使用二进制浮点的结果更令人惊讶。

因为floatreal代表实数,它们总是可以除以而没有余数。模的定义是:

a mod n = r,如果a = n*q + r,其中anqr整数,对于r的最小可能绝对值。

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

对于其他非整数但不动点的变量,可以找到模的定义,因为两个不定点值不能总是在没有余数的情况下进行除法。然而,通常您只想对整数运算使用模,否则您将得到与预期不同的结果。

相关内容

最新更新