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

为什么C#round和SQL round函数会产生不同的输出?,c#,sql-server,rounding,C#,Sql Server,Rounding,我使用的是C#和SQL中的ROUND函数,令人惊讶的是,这两个函数都产生了不同的结果 在SQL中:ROUND(1250.00,-2)=1300 在C#圆形1250中具有圆形和精度=2=1200 以前有人遇到过这种情况吗?C#默认情况下使用银行家四舍五入法,当你精确到.5分时,它将四舍五入到最接近的偶数,而不是总是四舍五入 msdn的备注部分描述了这种行为。基本上,它是为了减少当您将大量四舍五入的数字累加在一起时的舍入错误。使用Math.Round上的参数,中点舍入,来指定数字的舍入方式 publ

我使用的是C#和SQL中的
ROUND
函数,令人惊讶的是,这两个函数都产生了不同的结果

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

在C#
圆形1250中
具有圆形和
精度=2
=1200

以前有人遇到过这种情况吗?

C#默认情况下使用银行家四舍五入法,当你精确到.5分时,它将四舍五入到最接近的偶数,而不是总是四舍五入


msdn的备注部分描述了这种行为。基本上,它是为了减少当您将大量四舍五入的数字累加在一起时的舍入错误。

使用Math.Round上的参数,
中点舍入
,来指定数字的舍入方式

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);

四舍五入的难点在于如何处理十进制中的5。事实上,它们正好是一半,所以它们构成了一个平局。在维基百科的文章中有一个很好的解释。本质上,C#使用银行家四舍五入,当最后一个未舍入的数字为偶数时向下舍入,当最后一个未舍入的数字为奇数时向上舍入。这符合IEEE标准。SQL则遵循“始终向上取整5”规则。

如果您阅读,您将看到默认的舍入是“舍入到偶数”(银行家舍入),其中SQL Server 似乎正在使用“标准”舍入

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


如何解决问题:实现一个自定义舍入过程:

您使用的是哪台数据库服务器?这完全是关于语言舍入数字的方式。你的SQL显然是圆的,C当你在中间爆炸的时候。我建议试着用圆以外的东西。SQL中的上限是四舍五入的,但如果没有更多关于您试图做什么的信息,就真的不可能建议使用什么;NET BCL有。我正在使用MSSQL服务器。请帮助我实现结果的一致性。如果您需要精确的结果,请不要舍入。如果你对精确结果的期望值是四舍五入的,那么其中一种行为一定不能满足你的期望。如果你不知道是哪一个,那么你就不期望得到确切的结果。换句话说,你似乎不知道你想要什么。我尝试了这个参数,但没有用。仍然得到了相同的结果:(支持链接不再起作用。SQL中有一个银行家舍入的实现,它是为了减少正/负偏差,以及当您累积在正负值之间不均匀分布的舍入数时,向零或远离零的偏差。参考:Wikipedia文章。