T-Sql数值变量错误转换

时间:2015-02-20 23:18:13

标签: sql-server tsql type-conversion

如果数字数据之间的自动转换在T-Sql

中表现如此,这真的很奇怪
Declare @fdays as float(12)
Declare @mAmount As Money
Declare @fDaysi as float(12)

Set @fdays =3
Set @fdaysi =1
Set @mAmount=527228.52
Set @mAmount = @fdaysi * @mAmount/@fDays

Select @mAmount, 527228.52/3

此计算的结果是

175742.8281      175742.840000

这是否因为money和float实际上不是同一种数字数据而发生? Float是近似数字,Money是精确数字

2 个答案:

答案 0 :(得分:0)

  

Money和Decimal是固定的数值数据类型,而Float是   近似数值数据类型。数学运算的结果   浮点数似乎无法预测,尤其是在   涉及舍入。一定要明白的意义   使用Float之前的差异!

     

此外,Money并没有提供超过Decimal的任何优势。如果是分数   最多5位小数的单位在您的货币或无效时无效   数据库模式,只需使用具有适当精度的Decimal   规模。

参考链接:http://www.sqlservercentral.com/Forums/Topic1408159-391-1.aspx

Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server?

https://dba.stackexchange.com/questions/12916/datatypes-in-sql-server-difference-between-similar-dataypes-numeric-money

答案 1 :(得分:0)

float [ (n) ] 其中n是用于以科学计数法存储浮点数的尾数的位数,因此,它决定了精度和存储大小。如果指定了n,则它必须是介于1和53之间的值.n的默认值为53。

当1-2中的n时,则精度为7位数。 当25-53中的n时,则精度为15位。

因此,在您的示例中,精度为7位数,因此第一部分@fdaysi * @mAmount 舍入结果为7位527228.5。第二部分返回527228.5/3=175742.828并将175742.828投放到Money,结果为175742.8281。所以FLOAT和REAL是近似数据类型,有时你会得到这样的惊喜。

DECLARE @f AS FLOAT = '29545428.022495';
SELECT CAST(@f AS NUMERIC(28, 14)) AS value;

结果是29545428.02249500200000只有一个演员。