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

本文关键字:round 函数 输出 SQL 为什么 | 更新日期: 2023-09-27 18:15:27

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

In SQL: ROUND(1250.00, -2) = 1300

在c# ROUND 1250与圆和precision = 2 = 1200

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

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

c#默认使用银行家四舍五入,当你正好在0.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。它们实际上正好在中间,所以它们构成了一个平局。在维基百科的四舍五入文章中有很多关于平分的内容。从本质上讲,c#使用银行家四舍五入,当最后一个非四舍五入的数字是偶数时向下舍入,当最后一个非四舍五入的数字是奇数时向上舍入。这是符合IEEE标准的。而SQL则遵循"总是将5取整"的规则。

在Math上使用参数。四舍五入,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);