C#中System.Text.Json序列化Decimal避免科学计数法配置
解决System.Text.Json序列化decimal时的科学计数法问题及计算支持说明
一、禁用decimal的科学计数法序列化
使用System.Text.Json时,默认对极小或极大的decimal值会采用科学计数法序列化。要禁用这个行为,有两种常用方案:
方案1:自定义Json转换器(推荐,保持数字类型)
编写一个自定义的JsonConverter<decimal>,在序列化时指定非科学计数法的格式:
public class DecimalNoScientificConverter : JsonConverter<decimal> { public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.GetDecimal(); } public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options) { // G29是decimal类型的最大精度格式,会自动选择非科学计数法的最短表示 writer.WriteRawValue(value.ToString("G29")); } }
然后在序列化配置中添加这个转换器:
- 普通序列化场景:
var options = new JsonSerializerOptions { Converters = { new DecimalNoScientificConverter() }, // 可添加其他配置如缩进等 }; var jsonString = JsonSerializer.Serialize(yourUnitPrefixData, options);
- ASP.NET Core WebAPI场景,在Program.cs中全局配置:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DecimalNoScientificConverter()); });
方案2:将decimal序列化为字符串(简单但需前端转换)
如果接受将数值转为字符串输出,可以直接配置NumberHandling:
var options = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.WriteAsString };
这种方式下,前端拿到的是字符串类型的数值,需要手动转换为数字后再使用。
二、科学计数法在C#和JS中的计算支持
科学计数法只是数值的字符串表示形式,底层的数值存储和计算逻辑不受影响,所以在C#和JS中都完全支持计算:
- C#:decimal、double等数值类型可以直接解析科学计数法格式的字符串,计算时与普通数值无差异。例如:
decimal magnitude = decimal.Parse("1e-9"); decimal result = magnitude * 1000m; // 计算结果为0.000001m,完全正确
- JavaScript:JS的Number类型本身基于双精度浮点数,科学计数法的数值和普通数值在计算上等价。例如:
const magnitude = 1e-9; const result = magnitude * 1000; // 结果为0.000001,计算正常
内容的提问来源于stack exchange,提问作者Json Dimas
相关产品推荐
相关产品推荐

