接口返回类型是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类提供了高精度的数字计算功能,能够处理任意位数的小数,从而避免了浮点数计算中的精度问题。

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个示例代码,演示如何在Spring Boot项目中使用`PageHelper`实现在SQL层面的分页: 首先,需要在`pom.xml`中添加`pagehelper`依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> ``` 然后,在`application.properties`中添加相应的配置: ```properties # 分页插件配置 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ``` 接下来,定义一个`Page`类,用于封装分页参数和查询结果: ```java public class Page<T> { private List<T> content; // 数据列表 private long total; // 总记录数 private int pageNum; // 当前页码 private int pageSize; // 每页记录数 private String sort; // 排序字段 private String order; // 排序方式 // getter和setter方法 } ``` 然后,定义一个`PageHelperUtil`工具类,用于调用`PageHelper`进行分页查询: ```java public class PageHelperUtil { public static <T> Page<T> startPage(PageSortInterface pageSort, Supplier<List<T>> supplier) { PageHelper.startPage(pageSort.getPageNum(), pageSort.getPageSize(), pageSort.getSort() + " " + pageSort.getOrder()); List<T> list = supplier.get(); PageInfo<T> pageInfo = new PageInfo<>(list); Page<T> page = new Page<>(); page.setContent(list); page.setTotal(pageInfo.getTotal()); page.setPageNum(pageInfo.getPageNum()); page.setPageSize(pageInfo.getPageSize()); page.setSort(pageSort.getSort()); page.setOrder(pageSort.getOrder()); return page; } } ``` 在`startPage`方法中,我们调用`PageHelper.startPage`方法,指定当前页码、每页记录数和排序方式,并使用`Supplier`接口作为入参,接收一个查询结果的lambda表达式。然后,将查询结果封装为`Page`对象,包含数据列表、总记录数、当前页码、每页记录数、排序字段和排序方式。 最后,在`UserMapper`接口中定义一个`selectByRoleAndPage`方法,接收一个`PageSortInterface`类型的参数,并返回一个`List<User>`类型的结果: ```java public interface UserMapper extends MyBaseMapper<User> { @SelectProvider(type = MySelectProvider.class, method = "dynamicSQL") List<User> selectByRoleAndPage(PageSortInterface pageSort); } ``` 在`selectByRoleAndPage`方法中,我们调用`MySelectProvider.dynamicSQL`方法生成查询语句,并将`PageSortInterface`类型的参数作为入参传递给`PageHelperUtil.startPage`方法,实现分页查询。最终返回一个`List<User>`类型的结果。 使用示例如下: ```java @RequestMapping("/users") public Page<User> getUsers(@RequestParam int role, @RequestParam int pageNum, @RequestParam int pageSize, @RequestParam String sort, @RequestParam String order) { PageSortInterface pageSort = new PageSortImpl(pageNum, pageSize, sort, order); return PageHelperUtil.startPage(pageSort, () -> userMapper.selectByRoleAndPage(pageSort)); } ``` 在`getUsers`方法中,我们接收请求参数,创建一个`PageSortImpl`对象,实现`PageSortInterface`接口。然后,调用`PageHelperUtil.startPage`方法,传入`PageSortInterface`类型的参数和一个lambda表达式,获取分页查询结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值