为什么C#round和SQL round函数产生不同的输出?

我正在使用C#和SQL的ROUND函数,并且令人惊讶的是两者都产生了不同的结果。

在SQL中: ROUND(1250.00, -2) = 1300

在C# ROUND 1250 ,圆形和precision = 2 = 1200

有没有人遇到过这种情况?

默认情况下,C#使用银行家的舍入,当你正好在.5标记时,它会舍入到最接近的偶数,而不是总是向上舍入。

msdn 文章的备注部分描述了这种行为。 基本上,当您将大量舍入数字累积在一起时,可以减少舍入误差。

如果您阅读http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx ,您会看到默认的舍入是“舍入到均匀”(银行家的舍入),而SQL Server似乎正在使用“标准的“舍入

更新SQL Server根据参数进行对称算术舍入或对称向下舍入(修复)

如何解决问题:实现自定义舍入过程: http : //support.microsoft.com/default.aspx? scid = KB; EN-US; Q196652&ID = KB; EN-US; Q196652

四舍五入中的困难部分是如何处理十进制的5。 它们实际上恰好是中途,所以它们构成了平局。 在维基百科的Rounding文章中有一些关于打破平局的信息。 从本质上讲,C#使用银行家的舍入,当最后一个未连接的数字是偶数时向下舍入,当它是奇数时向上舍入。 这符合IEEE标准。 SQL改为遵循“始终围绕5向上”规则。

使用Math.Round, MidpointRounding上的参数指定舍入数字的方法。

 public enum MidpointRounding { // When a number is halfway between two others, it is rounded toward // the nearest even number. ToEven = 0, // When a number is halfway between two others, it is rounded toward // the nearest number that is away from zero. AwayFromZero = 1, } 

你可以这样使用它:

 int presicion = 2; double valueToRound; Math.Round(valueToRound / Math.Pow(10, precision), MidpointRounding.AwayFromZero) * Math.Pow(10, precision);