【问题标题】:How can I convert my float field into a Decimal in sql server?如何在 sql server 中将我的浮点字段转换为小数?
【发布时间】:2009-09-07 18:59:19
【问题描述】:

我想将我的浮点字段转换为十进制字段;我希望十进制字段的精度为 11,2,但是当我尝试更改字段的类型(例如:金额)时出现错误:“将浮点数转换为数字数据类型的算术溢出错误。 该语句已终止。”我的字段是十进制(11,2)在表中,我的最大值和最小值是:1,603,837,393.70 -1,688,000,000.00(金额)。

我创建了一个临时表来取出数据并更改了我的字段结构,并且工作正常。但现在我需要把数据放回去(临时表仍然有原来的浮点字段),我只是不能用插入选择语句让它插入值。

由于我的值没有超出我的类型的范围,我想知道为什么甚至不能对这样的 select 语句进行强制转换:

select Id,AccountId, cast(Amount as decimal(12,2)) as Amount,
cast(AmountB as decimal(12,2)) as  AmountB
FROM myTable

我无法确定不转换我的字段的原因。

【问题讨论】:

  • 你能从那个表中发布一些数据吗?

标签: sql sql-server


【解决方案1】:

但“1,603,837,393.70”的值需要小数点 (12,2) - 总共 12 位,小数点后 2 位。

也许您误解了decimal(11,2) 的工作方式?这意味着总共 11 位数字 - 左边 9 位,小数点右边 2 位。

MSDN docs for decimal and numeric types

十进制[ (p[ , s] )] 和数字[ (p[, s] )]

p(精度)

可以存储的小数位数的最大总数,小数点的左边和右边

马克

【讨论】:

  • 感谢您的解释。你澄清了我缺少关于十进制数据类型的基本概念。很好地解释了我的误解。
【解决方案2】:

您的问题简直令人困惑。你说“我的字段是十进制(11,2)在桌子上”,但这与你所说的最大值和最小值相矛盾,它们不在十进制(11,2)的范围内。如果您引用的错误来自您提供的 SELECT 查询,则 Amount 或 AmountB 的值超出可以由类型 decimal(12,2) 表示的值范围:-9,999,999,999.99 到 9,999,999,999.99。

如果您运行以下查询,您会发现这一点:

select
  min(Amount) as minAmount,
  max(Amount) as maxAmount,
  min(AmountB) as minAmountB,
  max(AmountB) as maxAmountB
from myTable

【讨论】:

    【解决方案3】:

    检查字段类型。他们是对的吗?

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多