【问题标题】:T-Sql numeric variables error conversionT-Sql 数值变量错误转换
【发布时间】:2015-04-22 18:37:47
【问题描述】:

在 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 实际上不是同一种数字数据吗?浮点数是近似数字,金钱是精确数字

【问题讨论】:

    标签: sql-server tsql type-conversion


    【解决方案1】:

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

    当 n 在 1-24 中时,精度为 7 位。 当 n 在 25-53 中时,精度为 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,只需要一个强制转换。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        猜你喜欢
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 2011-07-29
        相关资源
        最近更新 更多