当前位置:   article > 正文

Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决_springboot 返回前端数字很长

springboot 返回前端数字很长

前言

惯例,收到兄弟求救,关于long类型丢失精度的问题:

存在一个初学者不会,就会有第二个初学者不会,所以我出手。

正文

不多说,开搞。



如题, 后端返回的数据 给到 前端, Long类型数据太长导致精度丢失。

复现示例



比如我们写个接口:

我们特意去把 Long类型 14位 到 20位的数据都 塞到返回值里面
 

  1. @RequestMapping("/test")
  2. @ResponseBody
  3. public TestDTO test(){
  4. TestDTO testDTO=new TestDTO();
  5. testDTO.setNumStr("12345678901234568901234567890123456890");
  6. testDTO.setNum14(12345678901234L);
  7. testDTO.setNum15(123456789012345L);
  8. testDTO.setNum16(1234567890123456L);
  9. testDTO.setNum17(12345678901234567L);
  10. testDTO.setNum18(123456789012345678L);
  11. testDTO.setNum19(123456789012345689L);
  12. testDTO.setNum20(1234567890123456890L);
  13. return testDTO;
  14. }

TestDTO.java:
 

  1. public class TestDTO {
  2. private String numStr;
  3. private Long num14;
  4. private Long num15;
  5. private Long num16;
  6. private Long num17;
  7. private Long num18;
  8. private Long num19;
  9. private Long num20;
  10. //省略set、get
  11. }

这时候前端调用看看效果,可以看到出现了精度丢失的场景:

原因

 js数字的精度是有限的,Java的Long类型的数字超出了JavaScript的处理范围。
 内部只有一种数字类型Number,双精度64位格式存储,即使整数也是如此。
 最大的数值应该是2的53次方-1,十进制是【9007199254740991】,16位。
 所以说超过16位,那么如果属于Number类型去解析的,就会丢失精度。

解决方案:

@JsonSerialize(using=ToStringSerializer.class)



 看看效果:

 好了,该篇就到这。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/357003
推荐阅读
相关标签
  

闽ICP备14008679号