如何将Double类型转换为普通数字而非科学计数法格式?
解决Double字段序列化显示科学计数法的问题
问题根源
- Double类型精度限制:你期望的数值
23874928374923749823749823749远超出Double的精确表示范围(Double仅能精确存储53位以内的整数),存入Double时已经丢失精度,这是返回值与预期不符的核心原因。 - 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
相关产品推荐
相关产品推荐

