You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:37:05