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

MSSQL中Double类型值丢失小数点问题求助

问题描述

将字符串转换为Double类型时,本地测试无异常,但MSSQL数据库中存储值出现错误:当HallTwoTempMin的预期值为24.9时,数据库实际存储为249。转换代码如下:

HallTwoTempMin = Convert.ToDouble(hallTwoFinalPartMin);

Sensor模型定义:

public class Sensor
{
    public int Id { get; set; }

    public double HallOneTempCurrent { get; set; }

    public double HallOneTempMin { get; set; }

    public double HallOneTempMax { get; set; }
}

MSSQL对应数据类型为float。

更新说明:将模型字段类型改为decimal后,本地运行控制台程序可得到正确的24.90,但部署到服务器后,值仍变为249.00(已多次测试)。

可能原因
  • 区域文化差异:本地和服务器的系统区域设置不同,导致小数分隔符解析规则不一致。比如本地使用英文区域(小数分隔符为.),而服务器使用的区域以,作为小数分隔符,此时字符串"24.9"会被解析为249(.被视为无效分隔符直接忽略)。
  • 转换时未指定固定文化:Convert.ToDouble默认使用当前线程的文化设置,服务器环境的文化可能与本地不同,引发解析错误。
  • 数据库字段精度配置问题:若decimal字段未指定合适的精度和小数位数(如仅设置decimal而未指定(10,2)),可能导致存储时的格式异常。
解决方案
  1. 转换时显式指定不变文化
    修改转换代码,使用InvariantCulture确保小数分隔符解析统一:

    HallTwoTempMin = Convert.ToDouble(hallTwoFinalPartMin, System.Globalization.CultureInfo.InvariantCulture);
    // 若使用decimal类型则改为:
    HallTwoTempMin = Convert.ToDecimal(hallTwoFinalPartMin, System.Globalization.CultureInfo.InvariantCulture);
    
  2. 强制统一应用程序文化
    在应用程序启动时设置线程默认文化,避免服务器区域影响:

    System.Globalization.CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
    System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
    
  3. 修正数据库字段配置
    将MSSQL中的decimal字段设置为明确的精度和小数位数,例如decimal(10,2),确保存储时保留正确的小数格式。

  4. 验证输入字符串有效性
    检查服务器端接收到的hallTwoFinalPartMin字符串是否保持原始格式,排除数据传输、接口调用等环节导致的格式篡改(如.被意外替换)。

内容的提问来源于stack exchange,提问作者Kate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:53:17