后端向前端传参精度损失问题

1,229 阅读2分钟

后端为 Long,long 传到前端会存在精度损失 后端long类型的数据长度大于前端的数据长度

JavaScript中所有的数字,无论是整数还是小数,其类型均为Number。在程序内部,Number类型的实质是一个64位的浮点数,这与Java中double类型的浮点数是一致的;因此,JavaScript中所有的数都是浮点数。遵循IEEE 754标准(浮点数算术标准),JavaScript所能表示的数值范围为正负1.7976931348623157乘以10的308次方,其最小所能表示的小数为正负5乘以10的负324次方,这两个边界值可以分别通过访问Number对象的MAX_VALUE属性和MIN_VALUE属性来获取。对于整数,根据ECMAScript标准的要求,JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。值得注意的是,对于整数的位运算(比如移位等操作),JavaScript仅支持32位整型数,也即从-2147483648到+2147483647之间的整数。,JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。值得注意的是,对于整数的位运算(比如移位等操作),JavaScript仅支持32位整型数,也即从-2147483648到+2147483647之间的整数。

解决方案

SpringMVC

配置文件

    <mvc:annotation-driven>
      <mvc:message-converters>
         <bean
               class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
            <property name="objectMapper">
               <bean class="com.***.config.CustomObjectMapper">
               </bean>
            </property>
         </bean>

      </mvc:message-converters>

   </mvc:annotation-driven>
public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        super();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        registerModule(simpleModule);

        //忽略requestBody 多余属性
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);

    }

}

SpringBoot

注解方式