C#中能否安全地将Math.Round()的结果强制转换为整数?
关于
(int)Math.Round(x)强制转换的安全性分析 这段代码并非绝对安全,存在两种可能导致意外结果的场景:
1. 四舍五入结果超出int类型的取值范围
int类型的取值范围是-2147483648到2147483647。如果Math.Round(x)返回的double值超出这个范围,强制转换会触发以下情况:
- 若开启了编译溢出检查(比如Debug模式默认开启),会直接抛出
OverflowException; - 若关闭溢出检查(比如Release模式默认关闭),会产生一个错误的截断值,完全不符合预期。
示例代码:
double x = 2147483648.1; int y = (int)Math.Round(x); // 溢出检查开启时抛异常,关闭时得到错误值
2. 银行家舍入规则导致的预期偏差
Math.Round默认使用银行家舍入法(四舍六入五成双):当数值刚好处于两个整数中间时(比如2.5、3.5),会舍入到最近的偶数。这可能和你直觉中的“四舍五入”(逢5进1)不一致,导致结果不符合预期,但这不属于“截断”问题,是舍入规则的差异。
示例代码:
double x = 2.5; int y = (int)Math.Round(x); // y的值是2,而非3 double x2 = 3.5; int y2 = (int)Math.Round(x2); // y2的值是4
关于非整数double的意外截断
在int取值范围内,所有整数都可以被double精确表示。因此只要Math.Round(x)的结果落在int范围内,强制转换为int不会出现意外截断——转换会精准对应到那个整数值。
内容的提问来源于stack exchange,提问作者JoeBass
相关产品推荐
相关产品推荐

