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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:10:15