SQL Server 2008:为啥不四舍五入到小数点后两位?

Posted

技术标签:

【中文标题】SQL Server 2008:为啥不四舍五入到小数点后两位?【英文标题】: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,但我认为这并不重要,因为我对结果进行了修改 可能重复(没有票数?!?):***.com/questions/44046/… @OMG:我不认为这是重复的(尽管如果 SO 上没有重复我会感到惊讶,考虑到这是一个很常见的错误......我没有不过麻烦看) @Adam Robinson:OP cmets 建议使用截断进行舍入,这是链接提供的。 【参考方案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:您评论的第一部分是否丢失了?

以上是关于SQL Server 2008:为啥不四舍五入到小数点后两位?的主要内容,如果未能解决你的问题,请参考以下文章

为啥安装sql Server 2008时总是显示windows powershell错误?

为啥我的SQL Server 2008把数据库分离出来后就附加不进去了呢?

为啥安装的SQL SERVER 2008中SQL SERVER 服务只有1个

为啥 SQL Server Management Studio 2008 的服务器类型列表中缺少 SQL Server Compact Edition?

为啥我的电脑安装SQL server 2008时提示要安装windows powershell

sql server 2008同一个语句查询,为啥时快时慢