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

如何将Double类型转换为普通数字而非科学计数法格式?

解决Double字段序列化显示科学计数法的问题

问题根源

  1. Double类型精度限制:你期望的数值23874928374923749823749823749远超出Double的精确表示范围(Double仅能精确存储53位以内的整数),存入Double时已经丢失精度,这是返回值与预期不符的核心原因。
  2. JSON序列化默认行为:Spring默认使用的Jackson序列化库,在处理超出特定范围的Double值时,会自动采用科学计数法输出。

解决步骤

1. 更换字段类型为BigInteger(优先方案)

既然是超大整数,直接用BigInteger存储可彻底避免精度丢失,且序列化时默认输出完整数字:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class RespDto implements Serializable {
    private BigInteger interest;
}

如果业务中interest可能包含小数,替换为BigDecimal类型即可。

2. 用注解强制序列化格式(保留浮点类型时用)

若因业务限制必须保留Double/BigDecimal类型,可通过Jackson注解强制以非科学计数法格式输出:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class RespDto implements Serializable {
    // 强制转为字符串输出,避免科学计数法与精度丢失
    @JsonSerialize(using = ToStringSerializer.class)
    private Double interest;
    
    // 若用BigDecimal,写法相同
    // @JsonSerialize(using = ToStringSerializer.class)
    // private BigDecimal interest;
}

此方式会将数值转为字符串返回,前端需自行处理字符串转数字的逻辑。

3. 全局配置Jackson序列化规则(批量场景用)

如果多个字段都需要禁用科学计数法,可全局配置Jackson:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 禁用科学计数法输出
        mapper.configure(SerializationFeature.WRITE_NUMBERS_AS_STRINGS, false);
        mapper.configure(SerializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
        return mapper;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:50:44