Long型数据精度丢失问题

article/2025/9/11 16:00:54

数据库中有一个bigint类型数据,对应java后台类型为Long型,在某个查询页面中碰到了问题:页面上显示的数据和数据库中的数据不一致。例如数据库中存储的是:1475797674679549851,显示出来却成了1475797674679550000,后面几位全变成了0,精度丢失了。

1. 原因

这是因为Javascript中数字的精度是有限的,bigint类型的的数字超出了Javascript的处理范围。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。其结构如图:

各位的含义如下:

  • 1位(s) 用来表示符号位
  • 11位(e) 用来表示指数
  • 52位(f) 表示尾数

尾数位最大是 52 位,因此 JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992。而Bigint类型的有效位数是63位(扣除一位符号位),其最大值为:Math.pow(2,63)。任何大于 9007199254740992 的就可能会丢失精度:

9007199254740992     >> 10000000000000...000 // 共计 53 个 0
9007199254740992 + 1 >> 10000000000000...001 // 中间 52 个 0
9007199254740992 + 2 >> 10000000000000...010 // 中间 51 个 0

实际上值却是:

9007199254740992 + 1 // 丢失
9007199254740992 + 2 // 未丢失
9007199254740992 + 3 // 丢失
9007199254740992 + 4 // 未丢失

2.解决方法

解决办法就是让Javascript把数字当成字符串进行处理。对Javascript来说,不进行运算,数字和字符串处理起来没有什么区别。当然如果需要进行运算,只能采用其他方法,例如使用JavaScript的一些开源库bignumber之类的处理了。Java进行JSON处理的时候是能够正确处理long型的,只需要将数字转化成字符串就可以了。

 

方案一:

另一个方式是使用注解JsonSerialize

@JsonSerialize(using=ToStringSerializer.class)
private Long bankcardHash;

指定了ToStringSerializer进行序列化,将数字编码成字符串格式。这种方式的优点是颗粒度可以很精细;缺点同样是太精细,如果需要调整的字段比较多会比较麻烦。

 

方案二:

Jackson有个配置参数WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出。其功能介绍为:Feature that forces all Java numbers to be written as JSON strings.。使用方法很简单,只需要配置参数即可:

spring:jackson:generator:write_numbers_as_strings: true

这种方式的优点是使用方便,不需要调整代码;缺点是颗粒度太大,所有的数字都被转成字符串输出了,包括按照timestamp格式输出的时间也是如此。

 

方案三

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();

        //日期格式转换
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setDateFormat(new SimpleDateFormat(DateUtils.DATE_TIME_PATTERN));
        mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));

        //Long类型转String类型
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        mapper.registerModule(simpleModule);

        converter.setObjectMapper(mapper);
        return converter;
    }

}

 

推荐方案三,虽然我用的是方案2吧

 

 


http://chatgpt.dhexx.cn/article/bVfapABA.shtml

相关文章

vue前端处理后台返回的Long型数据精度丢失

vue前端处理后台返回的Long型数据精度丢失 问题描述 开发时后端返回的id为Long型,结果发现俩id怎么会一样呢?如下图是控制台Preview返回的数据 正以为是后端那边数据有误时,我点开Response发现这边的id是正常的… Preview和Response的数据…

C语言中的long型是究竟占4个字节还是8个字节?

今天在复习C语言的时候踩了一个很有意思的坑。 #include <stdio.h>int main() {printf("long int : %d\n", sizeof(long));return 0; }上面是我在IDE中使用的测试代码&#xff0c;执行它我的第一反应是会得到 4 的长度。 但实际的结果如下图所示&#xff1a;…

c java long_C语言中输出long long型数据怎么输出

展开全部 C语言中输出long long型数据使用%lld格式输出的方法: 1、32313133353236313431303231363533e59b9ee7ad9431333366303761 long long 是C99标准对整型类型做的扩展,每个long long类型的变量占8字节,64位。其表示范围为-9223372036854775808~9223372036854775807。 2、…

解决问题:long型数据精度丢失

在数据库中id设置为bigint且自增在java中对应long型数据 而在前台传输过程中键值过长导致精度丢失 原因是JS内置number类型的安全整数是53位&#xff0c;而Long为8个字节64位&#xff0c;会发生精度丢失 解决办法1&#xff1a; 点击设计表查看选项&#xff0c;发现自动递增数字…

浏览器接收Long型数据精度丢失问题的解决方案

问题描述 当我们后端返回前端Long类型的数据时&#xff0c;后三位会变成0&#xff0c;导致精度丢失。 有意思的地方是&#xff0c;postman测试接口时&#xff0c;查看返回值精度并未丢失&#xff0c;是字符串。 解决方案 在需要保留精度的属性上使用JsonSerialize(using To…

long型长整数字在前端页面显示异常及其解决方法

文章目录 1.引子2.解决问题&#xff08;1&#xff09;初试EL表达式取long型数值&#xff08;2&#xff09;再探EL表达式取字符串格式long型数值&#xff08;3&#xff09;最后一试---给EL表达式加引号 3.总结 1.引子 在做项目中&#xff0c;发现了一个诡异的事情&#xff0c;后…

long 型应该加上 l或者L

Long类型定义数字的L或LL后缀 如果数字后面不加L&#xff0c;默认的取值范围是int&#xff08;整型&#xff09; 比如&#xff1a; 给a赋值&#xff1a;long a&#xff1d;2147483648; &#xff08;数字超出int型取值范围&#xff09; 给a赋值&#xff1a;long a&#xff1…

JAVA生成20位LONG型UUID

编者在开发过程中用postman测试接口&#xff0c;发现要求id为必填且不能含有英文字母&#xff0c;问了对面开发人员才知道需要自己生成20位Long型uuid&#xff0c;写法大概如下&#xff0c;在需要生成的部分调用这个类即可。 package nc.bs.task.util;import java.text.Simple…

解决页面js接受Long型损失精度问题

目录 一、场景描述 二、问题分析 三、解决方法 一、场景描述 在下面这个后台管理中&#xff0c;当我们点击禁用后&#xff0c;会向服务器发送一个请求&#xff0c;同时携带这个员工的19位数字的id。 请求方式为PUT 这里的禁用对应employee表中的status字段&#xff0c;1为启…

java long格式化输出_C语言中输出long long型数据怎么输出?

展开全部 C语言中输出long long型数据使用%lld格式输出的e68a843231313335323631343130323136353331333365633838方法&#xff1a; 1、 long long 是C99标准对整型类型做的扩展&#xff0c;每个long long类型的变量占8字节&#xff0c;64位。其表示范围为-9223372036854775808~…

long型数字计算

在进行以亿为单位的数字计算时&#xff0c;int型往往会有溢出的问题&#xff0c;这时我们需要使用long型数字进行计算 public class demo04 {public static void main(String[] args) {//JDK7新特性&#xff0c;数字之间可以用下划线分割int money 10_0000_0000;int years 2…

随机游走模型(RandomWalk Mobility)

随机游走模型由首先由爱因斯坦在1926年以数学方式描述。由于自然界中的许多实体会以不可预知的方式移动&#xff0c;因此随机游走模型用来描述这种不稳定的移动。在这种移动模型中&#xff0c;移动节点随机选择一个方向和速度来从当前位置移动到新的位置。新的速度和方向分别从…

随机游走和趋势指标

简介 掷硬币游戏很久以来就存在了。让我们来玩这个游戏,不过目的在于测试并理解 FOREX 市场中的技术交易机制。我们并不是第一个将硬币拿在手中的人。那些希望更加详细地学习概率论的人可以参考 William Feller 所写的《An Introduction to Probability Theory and Its Appli…

图模型-随机游走算法

文章目录 推荐基本概念PageRankPersonalRankTextRankSimRank 推荐基本概念 其中用户user[A,B,C],物品item[a,b,c,d]&#xff0c;用户和物品有以下的关系 上述便是一个典型的二分图&#xff0c;我们用G(V,E)来表示&#xff0c;其中V为用户user和物品item组成的顶点集即[A,B,C…

链接分析之随机游走模型和子集传播模型

两个web页面通过hyperlink连接&#xff0c;可以认为这两个页面具有某种关系&#xff0c;在科学文献中这种关系很大程度上可以认为是引用文献与被引用文献在内容、主题上有很多的相似性&#xff0c;并且利用这种引用关系在信息计量学领域可以计算期刊的影响因子。互联网包含了浩…

【蚊子无人机】基于matlab随机游走模型无人机消除蚊子路径规划【含Matlab源码 2433期】

⛄一、随机游走模型 随机游走模型是通过随机选取某一文献作为起点&#xff0c;随机游走所有的文献&#xff0c;根据信息特征相似性对游走线路作加权处理&#xff0c;查阅所有文献后完成聚类。 随机游走算法通过对数据集进行统一的定义&#xff0c;把给定的数据集合作为固定数…

Meta Path Based Random Walk复现思路【基于元路径的随机游走模型】

title: Meta Path Based Random Walk date: 2022-02-13 00:43:08 tags: NLP的一些收获 课题原因需要复现ARNN模型。即“An Attentional Recurrent Neural Networkfor Personalized Next Location Recommendation”这篇论文&#xff0c;早就听说随机游走模型以及PageRank之类的…

随机游走模型(Random Surfer Model)

《这就是搜索引擎&#xff1a;核心技术详解》第6章链接分析&#xff0c;本章主要介绍一些著名的链接分析方法。本节为大家介绍随机游走模型&#xff08;Random Surfer Model&#xff09;。 互联网用户在上网时&#xff0c;往往有类似的网络行为&#xff1a;输入网址&#xff0c…

R语言模拟和预测ARIMA模型、随机游走模型RW时间序列趋势可视化

最近我们被客户要求撰写关于​​​​​​​时间序列的研究报告&#xff0c;包括一些图形和统计输出。 当一个序列遵循随机游走模型时&#xff0c;就说它是非平稳的。我们可以通过对时间序列进行一阶差分来对其进行平稳化&#xff0c;这将产生一个平稳序列&#xff0c;即零均值…

高斯消元配合概率dp-图上随机游走模型

2023大厂真题提交网址(含题解): www.CodeFun2000.com&#xff08;http://101.43.147.120/&#xff09; 最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上&#xff0c;供大家免费练习,体会真题难度。现在OJ已录入50道2023年最新大厂真题&#xff0c;同时在不断的更…