0

这是 linqpad 的结果。

decimal d = .035m + .035m + .035m; 
d.Dump();
decimal.Round(d,2).Dump();
0.105
0.10

这是 SMSS 的结果。

declare @d money
set @d = convert(money, .035) + convert(money, .035) + convert(money, .035)
select @d, round(@d,2)
(No column name)    (No column name)
0.105   0.11

是什么赋予了?

4

2 回答 2

1

正确答案是:

  • C# 的round将中点四舍五入到最接近的偶数
  • T/SQL 的四舍五入中点向上

下面的答案是错误的,但可能很有启发
性 A SQL 常量 like 0.1is a decimalnot a float,如 hvd 注释。


在 C# 中,您输入的是带有后缀0.35m的精确decimal常量。m

但在 SQL 中,您正在0.35从转换floatmoney. 来自的转换float不准确。如果您使用前缀 输入货币类型$,您将获得与 C# 相同的结果:

declare @d money
set @d = $0.035 + $0.035 + $0.035
select @d, round(@d,2)

SQL Fiddle 的示例。

于 2013-02-06T18:23:18.593 回答
0

@sgeddes 在上面回答了它。看起来像 Round 默认向下舍入:stackoverflow.com/a/8844698/1073631 - 尝试添加 MidpointRounding.AwayFromZero。

于 2013-02-07T04:49:42.737 回答