JS中长整型(long)不准确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中长整型(long)不准确相关的知识,希望对你有一定的参考价值。

参考技术A

js中的长整型(long)为53位,而JAVA中是64位(最大值2 63-1),所以,当数字值大于2 53时,末尾数字全部会变成0;
2020-10-08

长整型Long返回到前端,js出现精度丢失怎么办

前端后接口对接时,如果后台的id或者其他字段使用了长整型Long,就很容易出现js丢失精度问题。用接口工具调用时,往往id返回都是对的,但是一到页面上,js就后缀000。
前端说返回的值有问题,F12看看!后端说没问题,Postman看看!
这是js支持的问题,解决这个问题的办法很显然,返回字符串即可。
怎么实现呢,你可以直接将vo对象的id改成String类型,但是会带来copyProperties的不便,所以见过很多人通过增加虚拟字段实现。下面是一个整体解决方案:(需要略微了解下Spring的消息序列化原理,譬如MappingJackson2HttpMessageConverter是干嘛的)

  1. MainConfig(通常是主config类,@Configuration注解的,用来导入一些基础配置)增加MessageConvert的重写extendMessageConverters:

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jacksonConverter = null;
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                jacksonConverter = (MappingJackson2HttpMessageConverter) converter;
            }
        }
        if (jacksonConverter != null) {
            jacksonConverter.setObjectMapper(new CustomObjectMapper());
            converters.add(jacksonConverter);
        }
    }
  2. CustomObjectMapper的实现:
    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);
    }
    }

这样,接口返回的时候,所有的长整型字段,会被当做字符串处理,自动加上双引号。
技术图片

以上是关于JS中长整型(long)不准确的主要内容,如果未能解决你的问题,请参考以下文章

长整型Long返回到前端,js出现精度丢失怎么办

VB中Integer(整型)和Long(长整型)有啥区别?

整型int和长整型long

C语言的整型溢出问题 intlonglong long取值范围 最大最小值

怎样将长整型(long int)通过单片机串口发送,从另一个单片机串口接收。

C++ short/int/long/long long 等数据类型大小