如何在C# WinForm中实现带小数的二进制转十进制?
二进制转十进制(支持小数)的实现方案
你的原代码仅能处理二进制整数转十进制的场景,直接用Convert.ToInt32转换带小数点的字符串会抛出格式异常,且完全未考虑二进制小数的转换逻辑。下面是修改后的实现,支持带小数的二进制数转换,同时加入输入验证避免无效输入:
核心逻辑说明
- 拆分输入:将输入字符串按小数点拆分为整数部分和小数部分
- 整数部分计算:从右往左遍历每一位,每一位数字乘以2的n次方(n从0开始递增),累加得到整数结果
- 小数部分计算:从左往右遍历每一位,每一位数字乘以2的-n次方(n从1开始递增),累加得到小数结果
- 输入验证:确保输入仅包含0、1和最多一个小数点,避免非法格式
修改后的完整代码
if (binarybtn.Checked) { string inputStr = textBox1.Text.Trim(); decimal totalResult = 0; // 验证输入是否为合法二进制格式(允许整数、小数或纯小数/纯整数) if (!System.Text.RegularExpressions.Regex.IsMatch(inputStr, @"^[01]+(\.[01]+)?$")) { decimaltxtbox.Text = "无效输入:仅允许0、1和最多一个小数点"; binarytxtbox.Text = inputStr; return; } // 拆分整数与小数部分 string[] numberParts = inputStr.Split('.'); string integerSection = numberParts[0]; string fractionalSection = numberParts.Length > 1 ? numberParts[1] : string.Empty; // 计算整数部分 if (!string.IsNullOrEmpty(integerSection)) { long integerValue = 0; long powerOfTwo = 1; // 从右往左遍历整数位 for (int i = integerSection.Length - 1; i >= 0; i--) { int digit = integerSection[i] - '0'; integerValue += digit * powerOfTwo; powerOfTwo *= 2; } totalResult += integerValue; } // 计算小数部分 if (!string.IsNullOrEmpty(fractionalSection)) { decimal fractionalValue = 0; decimal powerOfTwo = 0.5m; // 对应2^-1 // 从左往右遍历小数位 foreach (char digitChar in fractionalSection) { int digit = digitChar - '0'; fractionalValue += digit * powerOfTwo; powerOfTwo /= 2; } totalResult += fractionalValue; } decimaltxtbox.Text = totalResult.ToString(); binarytxtbox.Text = inputStr; }
关键细节说明
- 使用
decimal类型存储最终结果,避免浮点数(如double)的精度丢失问题 - 整数部分用
long类型替代int,支持更大范围的二进制整数转换 - 正则表达式验证输入格式,提前拦截非法输入(比如包含2-9、多个小数点的情况)
- 兼容多种合法输入格式:如
101、101.101、.101、101.等
内容的提问来源于stack exchange,提问作者user21264001
相关产品推荐
相关产品推荐

