2012-09-19 35 views
1

我有一个MVC3 C#.Net网络应用程序。计算的结果是158 * 1.75 = 276.5。我希望这个数字可以达到277.我正在使用Math.Round,但它下降了。我知道我在某个地方见过这个问题。什么是解决方案?在C#中舍入。净

+1

请参考这个问题: http://stackoverflow.com/questions/977796/in-c-math-round2-5-结果是2,而不是3,你在开玩笑,我 –

回答

6

使用overload,需要一个MidpointRounding

Math.Round(276.5, MidpointRounding.AwayFromZero); 

演示:http://ideone.com/sQ26z

+0

+1来补偿。 – NominSim

+0

有趣的是,如果使用格式字符串将数字转换为带小数点零的字符串表示形式,即'string output =(276.5).ToString(“F0”);',那么离开 - 零规则也被使用。我不认为在字符串格式化数字时,甚至会使用to-even规则。 –

+0

+1 ...... dup也覆盖了所有的情况。 –

-1

尝试使用Math.Ceiling代替

+1

OP(我假设)可能希望276.1圆到276,而不是277. – NominSim

+0

啊当然:) – Johnny

+0

@NominSim ...那是真的276.1应该是276,而276.5应该是277 – MikeTWebb

0

用途:

Math.Round(value, MidpointRounding.AwayFromZero); 
2

.NET使用银行家的舍入默认;它将以5结尾的值舍入到最接近的偶数有效数字中,而不总是上升(称为“语义算术舍入”)。原因在于,如果你围绕一堆随机十进制数然后求和它们,当使用银行家舍入时,该总和将接近未被接通的数的总和,而不是算术舍入数的总和。

要强制使用等级学校的四舍五入规则,使用过载接受MidpointROunding枚举值:

Math.Round(myNumber, MidpointRounding.AwayFromZero); 
4

如前所述,您可以使用Math.Round(d, MidpointRounding.AwayFromZero)

默认情况下,.NET使用所谓的bankers rounding(或MidpointRounding.ToEven