【问题标题】:Why does TSQL on Sql Server 2000 round decimals inconsistently?为什么 Sql Server 2000 上的 TSQL 会不一致地舍入小数?
【发布时间】:2011-10-21 17:14:26
【问题描述】:

我正在尝试计算美元金额的百分比折扣值。在 50% 时,有时您会得到半便士,我需要将其四舍五入到最接近的美分。

在Sql中,我的计算如下:

round(retail * 0.5, 2, 0)

如果我采用以下值,我会得到不同的结果:

  • 4.39
  • 2.49

我得到的是不圆的:

  • 4.39 --> 2.195
  • 2.49 --> 1.245

当四舍五入时,我得到:

  • 2.195 --> 2.19
  • 1.245 --> 1.25

有人告诉我这是“银行四舍五入”的一种形式,但似乎影响舍入方向的值是整数值。

我的问题是我希望最高值会四舍五入到 2.20。如果这确实是银行家四舍五入,并且受此处整数值的影响,那么有人有防止这种行为的例子吗?如果不是银行家四舍五入,有人可以提供解释并可能提供解决方案来获得正常的四舍五入行为吗?

提前致谢!

【问题讨论】:

  • 好吧,我在 sql server 2008 中试过这个,我得到 2.200; sql 2000 无法为您提供帮助,但您是否尝试过:select round(4.39*0.5,2,0) => my result =2.2.

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


【解决方案1】:

retail 的数据类型是什么?我无法在 SQL 2000 上对此进行测试,但在 SQL 2008 R2 上,如果我使用 float,我会看到类似的结果。

float:         4.39 --> 2.195, rounds to 2.19 
               2.49 --> 1.245, rounds to 1.25

money:         4.39 --> 2.195, rounds to 2.20
               2.49 --> 1.245, rounds to 1.25

decimal(5,2):  4.39 --> 2.195, rounds to 2.20
               2.49 --> 1.245, rounds to 1.25

要显示由float 创建的近似值,您可以转换为decimal(20,19),并且很清楚为什么它会以这种方式四舍五入:

4.39 * 0.5 --> 2.1949999999999999000
2.49 * 0.5 --> 1.2450000000000001000

【讨论】:

  • 我使用的是浮点数。我将测试其他类型。我什至没有想过要这样做。谢谢!
  • 没问题。这是一个很好的例子,说明了为什么要使用 moneydecimal 而不是像 float 这样的近似数据类型。
【解决方案2】:

看看这里的一些舍入方法:SQL Server Rounding Methodsbankers rounding is Explained

【讨论】:

  • 警告:引用的文章犯了与 Jeff Ogata 的回答所证明的相同的错误——数据类型改变了 ROUND() 函数的行为。维基百科文章 Rounding 中解释了对舍入方法的相当彻底(非语言特定)的分析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多