当使用Math.Round(doubleValue, 2)
// ToEven默认为什么在c#2.135总是取整(使用2位小数),以2.13
// 2.135 - > 2.13何乐而不为2.14?
// 3.135 - > 3.14
而在2.13为什么不使用2.14 2.135 AwayFromZero轮什么时候?
当使用Math.Round(doubleValue, 2)
// ToEven默认为什么在c#2.135总是取整(使用2位小数),以2.13
// 2.135 - > 2.13何乐而不为2.14?
// 3.135 - > 3.14
而在2.13为什么不使用2.14 2.135 AwayFromZero轮什么时候?
要从标题回答这样的问题:
2.135是不始终舍(使用2位小数)至2.13,因为你使用的是二进制浮点数据类型,这只是发生在你的情况。 (由于leppie指出,2.135不能准确地表示为double,也请注意Microsoft seems to disinguish between decimal
and floating point types
,即使小数也符合定义)
如果你然而使用decimal
数据类型,而不是你将有一致的行为舍入,可以从this snippet比较不同的输出来验证:
decimal val1 = 2.135m;
decimal val2 = 3.135m;
Console.WriteLine("decimal val1({0}) rounded = {1}", val1, Math.Round(val1, 2));
Console.WriteLine("decimal val2({0}) rounded = {1}", val2, Math.Round(val2, 2));
double dval1 = 2.135;
double dval2 = 3.135;
Console.WriteLine("double val1({0}) rounded = {1}", dval1, Math.Round(dval1, 2));
Console.WriteLine("double val2({0}) rounded = {1}", dval2, Math.Round(dval2, 2));
因为您正在使用*二进制*浮点类型。十进制也是一种浮点类型。 – CodesInChaos 2014-12-04 16:49:14
@CodesInChaos嗯,你的陈述是有道理的,我正要编辑它然后我读第一句[这里](http://msdn.microsoft.com/en-us/library/364x0z75.aspx)这让我想到微软区分'十进制'和'浮点数据类型'一般来说,也许你有进一步阅读的另一个参考? – DrCopyPaste 2014-12-04 17:01:22
MSDN可能会因为喜欢而错误标记。但是浮点数有一个通用的定义,小数符合该定义,因为它有一个可变的指数来缩放。例如,维基百科将浮点描述为“一般来说,数字大致表示为固定数量的有效数字(有效数字)并且使用指数缩放”。 – CodesInChaos 2014-12-04 17:17:45
'2.135'实际上是'2.13499999999999999 ....' – leppie 2014-12-04 10:32:14
的确切值(双)'2.135'为分数是'1201898150554501/562949953421312'。下一个值是'2.1350000000000016',其中舍入到'2.14'。 – leppie 2014-12-04 10:34:25
@leppie指出,这是一个表示问题,如果您使用'decimal'变量,则舍入值将具有相同的小数部分(对于'2.135m和3.135m') – DrCopyPaste 2014-12-04 10:35:07