Springboot全局配置实现BigDecimal返回前端去除小数点后多余的0

文章介绍了在Java中使用Jackson库处理BigDecimal类型时,为避免精度损失,提供了两种解决方案:一种是自定义BigDecimalSerializer,另一种是在全局配置中添加专门的序列化器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方案

/**
 * BigDecimal序列化器
 */
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {

	@SneakyThrows
	@Override
	public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
		if (null != bigDecimal ) {
			String plainString = bigDecimal.stripTrailingZeros().toPlainString();
			jsonGenerator.writeString(plainString);
		} else {
			jsonGenerator.writeString(BigDecimal.ZERO.toPlainString());
		}
	}
}

 在需要的字段上加上注解
 @JsonSerialize(using = BigDecimalSerializer.class)
 private BigDecimal price;

后端统一处理返回前端Long返回前端损失精度问题

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {

	@Bean
	@ConditionalOnMissingBean
	public Jackson2ObjectMapperBuilderCustomizer customizer() {
		return builder -> {
			builder.locale(Locale.CHINA);
			builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
			// 设置日期格式
			builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
			// 解决long类型损失精度
			builder.serializerByType(Long.class, ToStringSerializer.instance);
			// 解决BigDecimal类型损失精度
			builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
			// 日期格式自定义类
			builder.modules(new PigJavaTimeModule());
		};
	}

}

第二种方式

/**
 * 全局序列化配置
 */
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
            @Override
            public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                if (value != null) {
                    gen.writeString(value.stripTrailingZeros().toPlainString());
                }
            }
        });
        objectMapper.registerModule(module);
        return objectMapper;
    }
}
### Vue 中处理 BigDecimal 类型数据的小数点多余零问题 在前后端交互过程中,当后端返回的数据类型为 `BigDecimal` 时,在前端可能会遇到小数点后面多余的零未被去除的情况。这通常是因为 JSON 序列化或浮点数精度问题引起的。 #### 数据转换方法 可以通过 JavaScript 的内置函数来解决这个问题。以下是几种常见的解决方案: 1. **使用 Number 对象的 toFixed 方法** 如果可以确定数值的有效位数,则可以直接调用 `toFixed()` 来保留指定数量的小数位并移除多余的零[^1]。 ```javascript const value = new Number(123.450).toFixed(2); // 输出 "123.45" ``` 2. **通过 String 转换方式去掉多余零** 可以先将数值转成字符串形式再利用正则表达式匹配和替换掉无意义的部分[^2]。 ```javascript function cleanDecimal(num) { return parseFloat(String(num)).toString(); } console.log(cleanDecimal('123.450')); // 输出 '123.45' ``` 3. **自定义过滤器 (适用于 Vue.js)** 在 Vue.js 开发环境中推荐创建全局或者局部 filter 函数用于视图层渲染前预处理这些数字字段值[^3]。 ```javascript Vue.filter('formatNumber', function(value){ if (!value || typeof value !== 'number') {return '';} return Math.floor(value * 1e5)/1e5; // 自适应调整倍率消除误差影响 }); <!-- 使用 --> {{ yourData | formatNumber }} ``` 以上三种办法都可以有效应对因传输过程产生的冗余信息干扰用户体验的现象发生;具体采用哪种取决于项目实际需求以及团队编码习惯等因素考量。 ```python print("Example Code Block") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值