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
相关产品推荐
相关产品推荐

