问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js输出整数的问题

发布网友 发布时间:2022-05-16 02:45

我来回答

3个回答

懂视网 时间:2022-05-16 07:07

分享一个js数字位数太大导致参数精度丢失的实例

最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变。

然后查了一下,发现确实是js精度丢失造成的。我的解决方法是将数字型改成字符型传输,这样就不会造成精度丢失了。如下图:

JS 数字丢失精度的原因

计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。如图

意义

  • 1位用来表示符号位

  • 11位用来表示指数

  • 52位表示尾数

  • 浮点数,比如

    0.1 >> 0.0001 1001 1001 1001…(1001无限循环)
    0.2 >> 0.0011 0011 0011 0011…(0011无限循环)

    此时只能模仿十进制进行四舍五入了,但是二进制只有 0 和 1 两个,于是变为 0 舍 1 入。这即是计算机中部分浮点数运算时出现误差,丢失精度的根本原因。

    大整数的精度丢失和浮点数本质上是一样的,尾数位最大是 52 位,因此 JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992。

    大于 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 // 未丢失

    结果如图

    以上,可以知道看似有穷的数字, 在计算机的二进制表示里却是无穷的,由于存储位数限制因此存在“舍去”,精度丢失就发生了。

    想了解更深入的分析可以看这篇论文(又长又臭):What Every Computer Scientist Should Know About Floating-Point Arithmetic

    三、解决方案

    对于整数,前端出现问题的几率可能比较低,毕竟很少有业务需要需要用到超大整数,只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度。

    对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数

    // 0.1 + 0.2
    (0.1*10 + 0.2*10) / 10 == 0.3 // true

    热心网友 时间:2022-05-16 04:15

    和p没有关系的,
    js所支持的数字精度只有16位,
    超过这个位数的数字后面的精度会丢失,变成 '0000'
    你把那个p去掉,输出的还是5670000

    热心网友 时间:2022-05-16 05:33

    因为系统把"</p>"也转换为数字了
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 Python中一行有多个or语句该怎么打? 什么是PatchGuard? 每天早上喝一杯蜂蜜水有害吗? 蜂蜜水喝多了是否对身体有害? 没带身份证怎样取票 谈谈军训对你的影响和帮助---详解。 一天的军训感言内容是教官生气了校长给我们唱歌了 2012年2月10号至2020年7月18号是几年几月几天? 《最后一次的讲演》全文 闻一多 20218.26要到几月几号有100天 文中括号里表明的是演讲时的什么最后一次演讲 从几月几日到几月几日一共经历了多少天?要算首尾日期吗 闻一多最后一次演讲 从9月1号开始算起再过三个月是几月份? 9月1号份到11月1号份是几个月 几月几号到几月几号有多少天题型 怎么在自己电脑上退出别人的稻壳账号? 稻壳儿在电脑上怎么退出? 培训的培训周期 会计培训班学习周期多久? 找一个带喵喵的情侣名字,要六个字的,不要符号等等 python,不管输入什么都运行if下面的语句,我的想法是输入字母&#39;A&#39;或‘a’,然后进入if下面的语句。 谁帮我想个QQ名字` 是情侣的 主题是 猫 我爸爸的姐姐我应该什么称呼 我妈妈的姐姐应该什么称呼 爸爸妈妈的姐姐有几种称呼 恩捷股份?恩捷股份一季度业绩大幅上涨原因?恩捷股份属于什么公司? 恩捷股份股是什么公司?恩捷股份股票未来业绩?同花顺恩捷股份互动平台? 在爱楼上看中一套两室的二手房,想问下一般福州满5年二手房过户费怎么算? 买了福州二手房楼盘,没满2年过户费怎么算? 我打算在福州买二手房,不知道具体要怎么买 金华十校联考成绩怎么查 企业内有了专门的运维人员,还需要运维管理系统吗? 湖北省2010年10月高等教育自学考试成绩查询 湖南教育生活数学十屇查询成绩 js 存储17为整数,为什么奇书会变成偶数? 清真鲈鱼的味道用文字怎么表达? 华为电脑无interest,安全怎么回事? 怎么申请 注册 我的学校是用H3C 802.1X 客户端的,但是最近因为换了电脑..结果上不到网了.错误提示是:IP地址绑定失败.谁知 我用的华为那个自带路由功能的猫用笔记本连上了wifi,也显示网络信号很好,为什么还是上不了网,上什么...