C# 在C中四舍五入到偶数#

C# 在C中四舍五入到偶数#,c#,math,rounding,C#,Math,Rounding,我没有看到我期望的数学成绩 return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97 正如我所理解的中点舍入。即使,第千位的5应该使输出为99.96。不是这样吗 我甚至尝试过这个,但它也返回了99.97: return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100; 我错过了什么 谢谢 你实际上并不在中点中点舍入。ToEv

我没有看到我期望的数学成绩

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
正如我所理解的中点舍入。即使,第千位的5应该使输出为99.96。不是这样吗

我甚至尝试过这个,但它也返回了99.97:

return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;
我错过了什么


谢谢

你实际上并不在中点<代码>中点舍入。ToEven表示如果您有数字99.965,即99.96500000[等],那么您将得到99.96。因为你要传递给数学的数字。舍入在这个中点以上,所以它是向上舍入的

如果要将数字四舍五入到99.96,请执行以下操作:

// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);
嘿,这里有一个方便的小函数,可以在一般情况下执行上述操作:

// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
    double multiplier = Math.Pow(10.0, digits + 1);
    double truncated = Math.Truncate(value * multiplier) / multiplier;
    return Math.Round(truncated, digits, mode);
}

仅当您位于中点时,它才舍入到99.96,即99.965:

C:\temp>ipy IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927 Type "help", "copyright", "credits" or "license" for more information. >>> import clr >>> from System import Math, MidpointRounding >>> Math.Round(99.9651, 2, MidpointRounding.ToEven) 99.97 >>> Math.Round(99.965, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.9649, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.975, 2, MidpointRounding.ToEven) 99.98 >>> C:\temp>ipy .NET2.0.50727.4927上的IronPython2.6Beta2(2.6.0.20) 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>导入clr >>>从系统导入数学,中点舍入 >>>数学四舍五入(99.9651,2,中点四舍五入.ToEven) 99.97 >>>数学四舍五入(99.965,2,中点四舍五入.ToEven) 99.96 >>>数学四舍五入(99.9649,2,中点四舍五入.ToEven) 99.96 >>>数学四舍五入(99.975,2,中点四舍五入.ToEven) 99.98 >>>
仅当值介于两个案例之间时,才会查看中点舍入


在你的例子中,它不是“5”,它是“535…”,所以它大于中点,并且大于0.96。要获得您期望的行为,您需要trunctate到第三个小数点,然后使用中点舍入。ToEven.

中点舍入值只有在尝试舍入最小有效位正好为5的值时才会起作用。换句话说,该值必须为
99.965
,才能获得所需的结果。因为这里不是这样,所以您只是在观察标准的舍入机制。有关更多信息,请参阅。

以下是对该主题有所帮助的结果:

Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven);      // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96

中点正好是5。。。不是535789,不是499999。

Math.Round'将十进制值四舍五入到指定的小数位数。'99.96500000四舍五入时,将两舍五入到99.96,将99.96500001四舍五入到99.67。它对整个值进行舍入。

如果是我,我不会使用
Math.Round()
,因为这不是您要实现的目标

这就是我要做的:

double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;  
这更容易阅读,更像是一种数学方法。
我将这个数字乘以
100
,现在我得到了
9996.535789

然后对其进行下限运算(与取整截然不同),返回最接近数字的最小整数,得到
9996

然后我除以
100
,得到所需的
99.96

附加说明
Floor与天花相反,天花返回最接近数字的最大整数。
因此,
9996.535789
的上限是
9997


两者都不同于四舍五入到无小数点,后者实际上返回与数字最接近的整数,无论其大小——以最接近的为准;这就是为什么当你使用舍入法时,你得到了
99.97

那么你想说的是,你希望它舍入到一个更远的数字?这是一个奇怪的“四舍五入”定义。这是银行家对你的四舍五入。难怪我们陷入这样的困境;-)不,这不是银行家的四舍五入。银行家四舍五入是指你选择四舍五入,即使两个选择距离相等。你不是处在两个选择距离相等的情况下。其中一个比另一个近,您要选择一个离得更远的。