【问题标题】:SQL Rounding down if x.xx5如果 x.xx5,则 SQL 向下舍入
【发布时间】:2014-06-11 10:05:59
【问题描述】:

有没有办法在值为 .005 的地方向下舍入而不是向上舍入?

例如

1.234 -> 1.23

1.235 -> 1.23

1.236 -> 1.24

这是为了开发票。我目前有一张发票显示总计: 46.88 英镑 + 9.38 英镑 = 56.25 英镑 (总计是商定的,但显然净值和增值税具有误导性,并且不完全相加)

我想将净值四舍五入到 46.87 英镑

编辑:完全停止舍入并仅显示到小数点后 2 位的可能替代方法如何?无论如何,我的总计计算正确,因为它从源中提取而不是添加四舍五入的小计。如果我完全阻止小计四舍五入,那么它们应该显示例如1.23并切断.xx5xxx?

【问题讨论】:

  • 那么 0.005 + 0.005 = 0.00 而不是 0.01。你最好的办法是解释以显示最大可能的精度或对已经截断的值求和
  • 听起来像你想要的Banker's rounding
  • @mucio 我只想将它应用于网络,而不是增值税。所以它将是 0 + 0.005(四舍五入为 0.01)= 0.01... 而不是当前出现的不正确的 0.02。 juergen d 完全正确...虽然我确信他们不会为 0.01 争论... 56.25 是商定的。 56.26 是不正确的。

标签: sql rounding


【解决方案1】:

假设您说的是 SQL Server:

DECLARE @val AS money
SET @val = 5.555
--SET @val = 5.556

SELECT
    CASE
        WHEN (CAST(FLOOR(@val*1000) as int) % 10) <= 5
        THEN FLOOR(@val*100) / 100
        ELSE CEILING(@val*100) / 100
    END

【讨论】:

    【解决方案2】:

    对于 MySQL 使用 select TRUNCATE(44.875, 2);

    对于 SQLServer,请使用 select ROUND(44.875, 2, 1)

    一个很好的技巧是将整数部分乘以 100,然后除以 100

    (在 SQLServer 中 select FLOOR(44.875 * 100)/100

    更新:

    当我更好地阅读问题时,我看到 x.xx5 应该向下舍入,x.xx6 应该向上舍入,所以我将其添加到答案中(SQLServer 中的示例,但在其他数据库中应该没有太大不同):

    select 
      CASE WHEN FLOOR(44.875 * 1000)-FLOOR(44.875 * 100)*10 <= 5 THEN
        FLOOR(44.875 * 100)/100
      ELSE
        ROUND(44.875, 2)
      END 
    

    【讨论】:

      【解决方案3】:
          select ROUND ( @val+0.004 , 2 , 1 )
      

      末尾的额外 1 在 mssql 中截断而不是四舍五入,添加 0.004 会将等于或大于 0.006 的任何内容提升到下一个数字,任何低于该数字的内容将被四舍五入。可以在其他 sql 上使用类似来转换为数字 10,2 或类似来获得这种截断,只需添加 0.004 即可满足您的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        • 2012-02-05
        相关资源
        最近更新 更多