后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)
程序员文章站
2022-07-15 13:46:36
...
1.数据库中的order_id为Long类型的
(1). TbOrder实体类
@ApiModel(value = "订单表")
@Table(name = "tb_order")
public class TbOrder implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId;
....
}
(2). OrderController控制类
@RequestMapping("/order")
@RestController
public class OrderController {
@Reference
private OrderService orderService;
@RequestMapping("/findAll")
public List<TbOrder> findAll() {
return orderService.findAll();
}
}
2.前端部分
orderController.js
$scope.findOrderList = function () {
orderService.findOrderList().success(function (response) {
$scope.orderList = response;
})
}
orderService.js
this.findOrderList = function () {
return $http.get("../order/findAll.do");
}
从上面看出来了,后台返回的数据,除了orderId不一致,其他数据都一致,最后在网上百度了一下,因为orderId是Long型的,所以JS在处理返回数据类型是Long的时候,精度会丢失一部分!!!
造成原因:JS内置有32位整数,而number类型的安全整数是53位。如果超过53位,则精度会丢失。正如现在后台传来一个64位的Long型整数,因此超过了53位,所以后台返回的值和前台获取的值会不一样。
解决方法:
ToStringConverter.java
package com.pingyougou.manage.converter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
public class ToStringConverter extends ObjectMapper {
public ToStringConverter() {
super();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
registerModule(simpleModule);
}
}
springmvc.xml
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" value="utf-8" />
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<!--对日期进行转化的-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.pingyougou.manage.converter.ToStringConverter">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
上一篇: PAT 1046. 划拳
下一篇: PAT 1046 划拳 python