JavaScript 在处理长整型时会有一定的问题,有时精度会缺失。

问题

当 Java 后台有个 Long 型值20175678901234567转到前台时,发现精度存在问题:

var batchNumber = 20175678901234567;
console.log(batchNumber);  // 20175678901234570

也就是说,到了前端 JavaScript 接收后,值变成了20175678901234570

原理

JavaScript 中所有的数字类型,实际存储都是通过 8 字节 double 浮点型 表示的。浮点数并不是能够精确表示范围内的所有数的, 虽然 double 浮点型的范围看上去很大: 2.23x10^(-308) ~ 1.79x10^308。 可以表示的最大整数可以很大,但能够精确表示,使用算数运算的并没有这么大。

比如,简单的加法运算,结果也是出人意料:

var x = 0.2;
var y = 0.1;
console.log(x+y);  // 0.30000000000000004

JavaScript 有所谓的最大和最小安全值:

console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991

在安全值范围内的整形都能够正常显示,超出安全值范围的整型则结果都是错误的结果, 因为它们进行的都是浮点数运算会丢失精度,都不可靠。

console.log(Number.MAX_SAFE_INTEGER + 2);  // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER + 2000);  // 9007199254742992

解决方案

直接将JavaScript 中的长整型以字符串形式来表示就不会有精度问题:

var batchNumberStr = '20175678901234567';
console.log(batchNumberStr);  // 20175678901234567

对于 Node.js 来说,也有一些开源库 bignum、bigint的等对于长整型的支持。

JavaScript 中的长整型精度问题相关推荐

  1. 前端js长整型精度丢失处理

    一.现象 在分页查询时,服务端会将返回的对象进行json序列化,转换为json格式的数据,而用户的ID是一个Long类型的数据,而且是一个长度为 19 位的长整型数据, 该数据返回给前端是没有问题的. ...

  2. js 如何代替java中的长整型_Javascript长整型

    我在javascript中看到了一件最奇怪的事情. 服务器端(弹簧): @RequestMapping(value = "/foo", method = RequestMethod ...

  3. c语言 long与integer,VB中Integer(整型)和Long(长整型)有什么区别?

    VB中Integer(整型)和Long(长整型)区别区别如下: 1.长度不同. Integer是int的封装类型是 32 位的整数,long 是 64 位的整数,表示范围:-2^63 ~ 2^63 - ...

  4. mysql中将长整型转换为时间类型或将时间类型转换为长整型

    长整型转换为时间类型的关键字:FROM_UNIXTIME(长整型,format): 时间类型转换为长整型的关键字:UNIX_TIMESTAMP(时间类型): 长整型转换为时间类型例子:select F ...

  5. python3长整型怎么用_python3有长整型吗

    Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) Number(数字) Py ...

  6. python中复数的实部和虚部都是浮点数_Python基础:数值(布尔型、整型、长整型、浮点型、复数)...

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  7. MFC中CString类字符串与长整型、浮点型、字符数组char数据之间的相互转换

    一.长整型数据与CString类字符串相互转换 1.将长整型数据转换为CString字符串类 CString str; long ld; str.Format(_T("%ld"), ...

  8. 本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。输入格式:输入在一行中给出一个长整型范围内的非负整数。输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格

    本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字.输入格式:输入在一行中给出一个长整型范围内的非负整数.输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格 1 ...

  9. printf中如何输出长整型?

    资料出处: http://hi.baidu.com/iamstupid/blog/item/26b9c0d0b63e9e8ba0ec9c84.html printf中如何输出 长整型? 一直都听说gc ...

最新文章

  1. JavaScript的运行模式
  2. 问题.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合...
  3. Visual Assist X 安装、使用 和 快捷键
  4. python画数学函数_Python 绘制你想要的数学函数图形
  5. Spring原始注解和新注解(使用注解代替xml配置文件)
  6. python爬虫实现网页采集器
  7. P3239 [HNOI2015]亚瑟王(期望)
  8. 以管理员身份运行IJ
  9. 62 getproperty对象
  10. hapi 使用 lab 和 code 进行测试
  11. WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
  12. 在腾讯,如何做 Code Review
  13. git远程仓库的使用
  14. jquery 逗号分割截取字符串_经典面试题:分割回文串
  15. python中narc是什么意思_python中@是什么意思
  16. 欢迎加入我们的架构师社群
  17. MVC中验证码的生成
  18. vb语言中怎样编码窗体中所有字体加粗_vb文本框字体加粗 vb字体加粗代码
  19. 状态机工作流.实列.报销审批流程(二)
  20. 吊打天猫精灵等“本土”智能音箱,HomePod做得到吗?...

热门文章

  1. 站群服务器用SK5 SOCKS5 配置多IP
  2. TogetherEC 6.3审计功能简单中文注解
  3. 微信好友太少?因为你还没掌握这些微信爆粉方法!(上篇)
  4. 蒙文计算机,蒙古文整词计算机生成理论研究
  5. 小白的jquery学习之路之天猫04 效果 fadeTo animate方法 天猫图片滑动效果
  6. win10 pro 语言设置问题
  7. Opencv-python滤镜系列(1): 浮雕和雕刻滤镜效果实现
  8. DDR4 Spec 第五章 终端电阻
  9. outlook2010查看邮箱服务器,怎么设置Microsoft Outlook2010邮箱
  10. 海湾gst5000协议号_海湾GST500\5000\9000主机集成接口卡第三方通讯协议