2012-03-06 285 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的数字?货币类型可以完全做到这一点。使用二进制浮点的结果更令人惊讶。

相关问题