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

C#项目遇多文本框计算错误、FormatException及rounding异常求助

搞定C#里的FormatException和Decimal舍入坑

嘿,你碰到的这几个问题我之前做项目时也踩过类似的坑,来给你逐个拆解解决:

1. 先解决System.FormatException这个讨厌的报错

这个错说白了就是你把不是正经数字的字符串转成decimal的时候触发的——比如文本框里是空的、有空格、打了字母,或者用了和系统默认不一样的小数点(比如欧洲用户习惯打逗号,你代码却认点)。

给你几个实用的解决办法:

  • 别用Parse,改用TryParse:这货不会直接抛异常,还能告诉你转换成没成功,比如:
    string input = yourTextBox.Text.Trim(); // 先把前后空格清掉
    if (decimal.TryParse(input, out decimal num))
    {
        // 转换成功,放心用num计算
    }
    else
    {
        // 弹个提示告诉用户输入合法数字
        MessageBox.Show("麻烦输入有效的数字哦!");
    }
    
  • 指定文化兼容不同分隔符:如果你的用户可能输入7,99这种逗号当小数点的情况,就指定不变文化来解析:
    decimal.TryParse(input, NumberStyles.Number, CultureInfo.InvariantCulture, out decimal num);
    
  • 查堆栈找具体出错行:你给的堆栈信息没写完,找到StringToNumber对应的代码行,看看是哪个文本框的输入搞事情,针对性排查更快。

2. 解决"7.99"舍入后变成7的诡异问题(位置b)

这个十有八九是你用了截断而不是舍入,或者用错了舍入方法。比如直接把7.99m强转成int,会直接砍掉小数部分得到7,但正常舍入应该是8才对。

正确的操作方式:

  • 要四舍五入到整数就用Math.Round:
    decimal value = 7.99m;
    decimal rounded = Math.Round(value, 0); // 结果是8,这才对
    
  • 要是需要向上/向下取整,就用Math.Ceiling(往上凑整)或Math.Floor(往下凑整):
    decimal up = Math.Ceiling(7.99m); // 8
    decimal down = Math.Floor(7.99m); //7——你现在可能就是用了这个才得到7的
    
  • 赶紧去位置b的代码看看:是不是不小心写了(int)yourDecimalValue?这种强制转换是截断不是舍入,赶紧换成专门的舍入函数。

3. 多个文本框计算出错的连锁问题

这个基本是前面两个问题的后遗症:比如某个文本框转换失败导致数值不对,或者舍入错了影响了最终结果。给你两个排查方向:

  • 每个文本框的输入都用TryParse校验,确保参与计算的都是合法的decimal;
  • 计算时尽量全程用decimal,别中途转成int或double(double容易丢精度);
  • 把计算拆成小步骤,每一步都打印或者调试看数值,很快就能找到哪个环节出问题。

内容的提问来源于stack exchange,提问作者R.Soomro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:08:37