C#怎么解决JSON反序列化数字变科学计数法_C#处理浮点数精度【避坑】

星晨小哥_8169

星晨小哥_8169

2026-05-03

846人浏览

原创

json反序列化后double/decimal显示为科学计数法是tostring()默认行为,数值精度未丢失;金额等高精度场景应使用decimal而非double,并确保json中数字不带引号。

c#怎么解决json反序列化数字变科学计数法_c#处理浮点数精度【避坑】

JSON反序列化后double或decimal变成1.2345E+10这类科学计数法显示

这不是反序列化出错了,而是ToString()默认行为——double和float在转字符串时,.NET会自动用科学计数法表示“过大”或“过小”的值。实际数值没丢精度,只是显示吓人。

常见场景:API返回{"price":123456789.12},反序列化成double price后打印price.ToString(),输出1.2345678912E+08。

  • 别在日志或UI里直接.ToString()原始double,改用.ToString("G")(通用格式)或"F2"等显式格式
  • 如果业务要求高精度(比如金额),反序列化目标类型别用double,改用decimal——它不走IEEE 754浮点规则,不会触发科学计数法默认逻辑
  • JsonSerializer.Deserialize<t></t>(System.Text.Json)对decimal字段默认就能精确还原,只要JSON里是合法数字字面量(不含引号)

用System.Text.Json反序列化decimal却得到0或抛JsonException

典型原因是JSON里数字被包了双引号,比如{"amount":"123.45"}。此时System.Text.Json默认不把字符串自动转decimal,直接失败或静默归零(取决于配置)。

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
  • 检查原始JSON:用JsonDocument.Parse()先粗略看下amount节点的ValueKind是Number还是String
  • 若服务端无法改JSON格式,可注册自定义JsonConverter<decimal></decimal>,在Read方法里判断refTokenType == JsonTokenType.String再decimal.TryParse
  • 避免全局开PropertyNameCaseInsensitive = true以外的宽松模式——它不解决字符串数字问题,反而掩盖类型不匹配

Newtonsoft.Json里float/double反序列化后计算结果异常

根本原因不是JSON库,而是float和double本身的二进制浮点限制。例如0.1 + 0.2 != 0.3,反序列化只是把那个“本来就不精确”的二进制值读进来而已。

  • 涉及货币、计数、ID等必须精确的场景,强制约定服务端传数字不带引号,并在C#端用decimal接收
  • Newtonsoft.Json默认把JSON数字映射到double,哪怕你声明字段是decimal——必须配JsonSerializerSettings.FloatParseHandling = FloatParseHandling.Decimal
  • 别依赖Convert.ToDecimal(obj)去救场:如果obj已经是double类型,再转decimal只会把误差固化下来

想保留JSON里原始数字字符串(比如超长整数ID不被截断)

64位整数在JavaScript里超过Number.MAX_SAFE_INTEGER(9007199254740991)就会丢失精度。C#用long接可能溢出,用double接则必然不准。

  • 最稳方案:把ID字段声明为string,跳过数字解析,后续需要时再按需转BigInteger或校验格式
  • System.Text.Json从.NET 6起支持JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString,配合long?字段可容忍带引号的数字字符串
  • Newtonsoft.Json需手动加[JsonConverter(typeof(StringToNumberConverter))],但注意这不能挽回JS端已丢失的精度

关键点容易被忽略:科学计数法只是显示问题,而精度丢失是数据源头就发生的——得先分清你遇到的是“看起来怪”还是“算出来错”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1012

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

2891

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

865

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2615

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

312

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

389

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

631

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

329

20

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.26

1003

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习