【问题标题】:SQL Server 2008: Why won't this round to two decimal places?SQL Server 2008:为什么不四舍五入到小数点后两位?
【发布时间】:2011-02-07 19:33:25
【问题描述】:
SELECT
   ROUND(WeightInOZ / 16, 2)as WeightInLbs
FROM
   Inventory

我得到的结果看起来像一个整数 1,2 等

【问题讨论】:

  • WeightInOZ的数据类型是什么?
  • 它是一个 int,但我认为这并不重要,因为我对结果进行了修改
  • 可能重复(没有票数?!?):stackoverflow.com/questions/44046/…
  • @OMG:我不认为这是重复的(尽管如果 SO 上没有重复我会感到惊讶,考虑到这是一个很常见的错误......我没有不过麻烦看)
  • @Adam Robinson:OP cmets 建议使用截断进行舍入,这是链接提供的。

标签: sql sql-server tsql sql-server-2008 rounding


【解决方案1】:

尝试将 16 更改为 16.0

SELECT
   ROUND(WeightInOZ / 16.0, 2)as WeightInLbs
FROM
   Inventory

您看到了奇怪的结果,因为它将除法的结果视为整数而不是小数。指定 .0 告诉 sql server 将其视为小数。

更新:

如果尾随的零吓坏了你,你可以随时这样做:

SELECT
   CAST(ROUND(WeightInOZ / 16.0, 2) AS NUMERIC(8,2)) as WeightInLbs
FROM
   Inventory

【讨论】:

  • 这将给我这个结果:0.060000 这是正确轨道上的定义
  • 嗯,你期待什么结果?
  • 我期待 0.06 或 233.23 等
  • 我知道这看起来很奇怪,但它们是相同的数字。如果您不喜欢看到尾随零,您可以使用我的更新中描述的方法。
  • 哦,我明白了,这很聪明
【解决方案2】:

问题是这样的:

WeightInOZ / 16

由于您要处理两个整数,SQL Server 会截断余数,因此没有小数部分可以舍入。

您想要做的是强制它执行浮点(或十进制)除法。最简单的方法是将16 更改为16.0

SELECT
   ROUND(WeightInOZ / 16.0, 2)as WeightInLbs
FROM
   Inventory

【讨论】:

  • @Nicholas:您评论的第一部分是否丢失了?
猜你喜欢
  • 1970-01-01
  • 2012-05-09
  • 2022-01-02
  • 1970-01-01
  • 2014-06-03
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多