当前位置: 首页 > news >正文

避坑:C# json反序列化为float精度丢失

在 C# 中将 JSON 反序列化为 float 时,确实容易出现精度丢失的问题,主要原因包括:

  • float 和 double 是 IEEE 754 浮点数,无法精确表示某些十进制小数
  • JSON 中的数值是十进制字符串,反序列化时被强制转成二进制浮点数,导致精度误差。

✅ 避坑方案

✅ 1. 使用 decimal 类型替代 float

decimal 是十进制浮点类型,精度更高,适合金融、金额等场景。

public class MyData
{public decimal Value { get; set; }  // 推荐
}

实测:将 0.4064 作为 float 会丢失精度,而作为 decimal 不会 。


✅ 2. 使用 System.Text.Json 的 GetRawText() 保留原始字符串

如果你必须用字符串形式读取 JSON 中的数值(如科学计数法 "5e-0000006"),可以使用:

using System.Text.Json;var json = "{\"myfield\":5e-0000006}";
using var doc = JsonDocument.Parse(json);
var rawValue = doc.RootElement.GetProperty("myfield").GetRawText();
Console.WriteLine(rawValue);  // 输出:5e-0000006

适用于需要精确记录原始格式的场景 。


✅ 3. Newtonsoft.Json 中用字符串接收数字

使用 JsonProperty 将数字字段反序列化为字符串,避免精度问题:

public class MyJson
{[JsonProperty("myfield")]public string MyField { get; set; }
}

❗不推荐的做法

  • 不建议用 float 或 double 接收高精度小数 JSON 字段;
  • 不建议依赖正则提取 JSON 中的数值字段,除非解析器无法满足需求 。

✅ 总结建议

场景推荐做法
需要高精度计算使用 decimal
需要保留原始字符串格式使用 GetRawText() 或字符串
不需要精度(如图形坐标)float/double 可接受

如需进一步处理高精度 JSON 数值(如科学计数法或超长小数),建议使用 decimal 或自定义 JsonConverter 进行转换。

http://www.lryc.cn/news/597240.html

相关文章:

  • 棱镜技术在光谱相机中应用
  • 第八章 W55MH32 HTTP Client示例
  • 机器人行业工商注册企业基本信息数据(1958-2023年)
  • 9.0% 年增速驱动!全球自清洁滚轮拖布机器人市场2031年将迈向 946 百万美元
  • [spring6: @EnableWebSocket]-源码解析
  • [深度学习] 大模型学习3下-模型训练与微调
  • (Arxiv-2025)OmniGen2:通向先进多模态生成的探索
  • springboot集成LangChain4j
  • 华为仓颉编程语言实践体验
  • 开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输
  • 高级IO简单介绍
  • 小架构step系列23:加载自定义配置
  • 基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)
  • 快速梳理遗留项目
  • AI聊天方案:vue+nodeJs+SSE
  • Git 常用的提交类型
  • NX741NX777美光固态闪存NX783NX791
  • CentOS 7 Linux 基础知识点汇总
  • Day01_C++
  • 河南萌新联赛2025第二场-河南农业大学
  • 第九讲:C++中的list与forward_list
  • (进阶向)Python第十三期,opencv的图像预处理方法[1]
  • 性能测试-jmeter实战5
  • 28. 探秘重写与重载:面向对象基础
  • ubuntulinux快捷键
  • Ubuntu 1804 编译ffmpeg qsv MediaSDK libva 遇到的问题记录
  • freqtrade在docker运行一个dryrun实例
  • Python实战:基于Streamlit的股票筛选系统,实时K线图+数据缓存优化
  • C/C++中的内存管理
  • uniapp+vue3小程序点击保存图片、保存二维码