如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字

Posted

技术标签:

【中文标题】如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字【英文标题】:How to return a number with two decimal places in SQL Server without it automatically rounding 【发布时间】:2020-06-25 14:49:57 【问题描述】:

这很奇怪,我有一个成本价和一个平均成本价。 avg 由 avg 函数确定,与成本价相比,如下所示:

Cost Price | Average Cost Price
   8.24            8.23897666

现在当我使用下面的代码时,即使我没有指定任何圆形函数,它也会将其更改为 8.24

select cast(8.23897666 as numeric(18,2))

我已尝试将其转换为浮点数,但仍将其四舍五入为 .24,即使我希望它只返回 2 位小数。

任何人都可以对此有所了解,因为我不确定为什么会发生这种情况? AS 不管小数点前的数字是多少,我都会返回完整的数字和 2 个小数位。

【问题讨论】:

确实指定了四舍五入 - 当有 8 位可用时,您要求的数字只有两位小数。此必须向上或向下舍入。对于8.238,预期结果是8.24。如果你想要不同的结果,你应该明确指定你想要的舍入类型 你期望什么输出而不是8.24 @PanagiotisKanavos 我只是希望该数字返回为 8.23。同样,如果我有多个 102.679999,那么我想返回 102.67 而不是 0.68 的静态数字。因为如果成本价是 8.24,平均值是 8.23890,那么它显示 8.24 作为平均值是错误的,因为这是实际成本价,平均值不能与成本相同。 正常的期望是得到8.24。在学校,预期的结果是8.24。会计,财务,实际上任何类型的业务应用程序都是如此。你要求截断而不是四舍五入。需要使用ROUND的第三个参数指定截断而不是舍入 至于为什么除了编程语言之外的所有人都希望舍入,因为这减少了舍入带来的错误。截断会导致错误0.00897666。在0.00102334 中四舍五入。这少了8倍。如果你只有 100K 行,那就加起来 【参考方案1】:

您可以使用floor() 和整数除法:

select floor(8.23897666 * 100) / 100

或者更好的是,将round() 与非0 第三个参数一起使用:

select round(8.23897666, 2, 1)

【讨论】:

ROUND(8.23897666,2,1) 截断 @PanagiotisKanavos:是的,你评论的时候我正在打字……谢谢。

以上是关于如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

如何在不使用pivot和unpivot的情况下在SQL Server中水平显示数据?

如何在不使用 Docker 或 Windows Server 2016 上的 Confluent 平台的情况下在 Kafka 中设置 Debezium SQL Server 连接器?

我可以在不使用 ROW_NUM () OVER (ORDER BY xxxxx) 的情况下在 Sql Server 中对查询进行分页吗?

如何在不四舍五入的情况下在 Java 中格式化双输入?