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

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);

额外的代码优化建议

除了解决小数点的问题,你的代码还有几个可以优化的地方,帮你提升效率和准确性:

  1. 避免重复查询数据库
    你现在在for循环里每次都调用skzAdapterText.LoadValuesText(time),这会重复从数据库加载相同的数据,完全没必要!把这部分代码提到循环外面就行。

  2. 更优雅的NaN判断
    不用把值转成字符串判断是不是"NaN",直接用Double.IsNaN(value)就行,这样更准确也更高效。

  3. 修正计数逻辑
    原来的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:34:05