为什么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#默认使用银行家四舍五入,当你正好在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);