接口返回类型是List<Long>的坑

数据丢失demo

controller中的写法

@Operation(summary = "通过标签获取表单id")
    @GetMapping("listIdByTag")
    public Result<List<Long>> listIdByTag(@ModelAttribute Query query) {
    
    
        query.setUserId(contextUtil.getUserid());
        return Result.content(demoService.listIdByTag(query));
    }
实际数据:
[1656187461040214016,1650042689615695872,1656188185293623296]
前端接收到是数据:
[1656187461040214000,1650042689615696000,1656188185293623300]

明显看出存在精度丢失的情况。

在处理数值类型的数据时,精度丢失是一个常见的问题,尤其是在使用浮点数时更容易出现此类问题。为了避免精度丢失,可以在前后端之间传输数据时使用字符串类型代替数值类型。

具体地,如果在Spring Boot中的接口返回类型是List<Long>,则可以将其转换为List<String>类型,并在前端接收时再将字符串类型的值转换为Long类型。例如,可以使用Java中的String.valueOf()方法将Long类型的值转换为字符串类型,前端在解析JSON数组时再使用parseInt()或parseFloat()等方法将字符串类型的值转换为Long类型。

另外,如果需要进行浮点数的计算,可以使用Java中的BigDecimal类来避免精度丢失。BigDecimal类提供了高精度的数字计算功能,能够处理任意位数的小数,从而避免了浮点数计算中的精度问题。

总结

在处理数值类型的数据时,需要根据具体的场景选择合适的数据类型和计算方法,以避免出现精度丢失等问题。

猜你喜欢

转载自blog.csdn.net/zhoqua697/article/details/130638261