C#中将数组内字符串转换为Double时小数点丢失的问题及求和实现求助
解决字符串转Double时小数点丢失的问题
嘿,一年级的同学!我看你遇到了个头疼的小问题——把字符串转成Double的时候,好好的带小数点数值直接变成了一串大整数,比如44.20216139610997变成了4420216139610997对吧?这大概率是系统区域文化设置在搞鬼,咱们一步步来搞定它:
问题根源
你的电脑默认区域设置可能用逗号,作为小数点分隔符,但你的字符串里用的是点.。Convert.ToDouble默认会跟着系统区域规则走,所以它把.当成了无关符号直接忽略,自然就把带小数点的数变成了整数。
快速解决方案
只需要修改转换代码,用**不变文化(InvariantCulture)**来解析字符串,这样不管系统是什么区域,都认.作为小数点:
原来的代码:
Double value = Convert.ToDouble(tmpRow); //Double.Parse(tmpRow);
改成:
// 用不变文化解析,强制识别点号为小数点 Double value = Convert.ToDouble(tmpRow, System.Globalization.CultureInfo.InvariantCulture);
或者用Double.Parse的重载版本也可以:
Double value = Double.Parse(tmpRow, System.Globalization.CultureInfo.InvariantCulture);
额外的代码优化建议
除了解决小数点的问题,你的代码还有几个可以优化的地方,帮你提升效率和准确性:
避免重复查询数据库
你现在在for循环里每次都调用skzAdapterText.LoadValuesText(time),这会重复从数据库加载相同的数据,完全没必要!把这部分代码提到循环外面就行。更优雅的NaN判断
不用把值转成字符串判断是不是"NaN",直接用Double.IsNaN(value)就行,这样更准确也更高效。修正计数逻辑
原来的counter是统计所有尝试解析的次数,但你其实应该只统计有效数值的数量(非NaN、非0的数),不然最后算平均值的时候会把无效次数也算进去,结果会不准。
修改后的完整代码
String[] values; List<Double> valueList = new List<Double>(); int profilePosCount = 5; // 把数据库查询移到循环外,只加载一次数据 DataTable profilData = skzAdapterText.LoadValuesText(time); String SQLvalues = (String)profilData.Rows[0][2]; values = SQLvalues.Split('#'); for (int i = 0; i < profilePosCount; i++) { double summe = 0; int counter = 0; foreach (String tmpRow in values) { try { // 用不变文化解析字符串,确保小数点正确识别 Double value = Convert.ToDouble(tmpRow, System.Globalization.CultureInfo.InvariantCulture); // 只统计非NaN且非0的有效数值 if (!Double.IsNaN(value) && value != 0) { summe += value; counter++; } } catch (Exception ex) { // 可选:打印错误信息,方便排查哪些字符串解析失败 // Console.WriteLine($"解析字符串 '{tmpRow}' 出错: {ex.Message}"); } } // 只有当有有效数值时才计算平均值 if (counter != 0) valueList.Add(summe / counter); }
这样改完之后,小数点丢失的问题应该就解决了,代码也更高效准确啦!
内容的提问来源于stack exchange,提问作者Astirak
相关产品推荐
相关产品推荐

