首页 > 其他分享 >JS精度丢失

JS精度丢失

时间:2023-04-21 16:48:49浏览次数:46  
标签:0000 0011 53 JS 1111 丢失 const IEEE 精度

目录

Javascript是非数据安全类型的语言,所以JS尾数精度有丢失的问题

Number类型

通过查阅JS官方文档

在JS定义的浮点数会自动转换为Number类型,Number类型是一个双精度64位浮点数,二进制存储格式执行IEEE 754标准

image

通过查阅维基百科,64位二进制格式IEEE 754的定义

image

Number能处理的最大安全值和最小安全值分别为:

image

对于JS来说超过\(2^{53}-1=9007199254740991\)和\(-2^{53}+1=-9007199254740991\)都是不安全的

比如:

image

精度是如何丢失的

const m1 = 9007199254740991;

推导过程,10进制转2进制转IEEE:

9007199254740991

= \(2^{53}-1\)

= \(2^{52}+2^{51}+2^{50}+...+2^{2}+2^{1}+2^{0}\)

= 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

+ 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

+ 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

...

+ 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100

+ 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010

+ 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

= 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

= 1.111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 * \(2^{52}\)

符号位:正数 = 0

指数:52 = 000 0011 0100

尾数:1.111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

IEEE:0000 0011 0100 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

还原:

1.111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 * \(2^{52}\)

= 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 (小数点右移52位)

= 9007199254740991

const m2 = 9007199254740992;

推导过程,10进制转2进制转IEEE:

9007199254740992

= 1 * \(2^{53}\)

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

符号位:正数 = 0

指数:53 = 000 0011 0101

尾数:1 = 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000(最后一位溢出)

IEEE:0000 0011 0101 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

还原:

1 * \(2^{53}\)

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000(小数点右移53位)

= 9007199254740992(虽然与期望值9007199254740992相同,但是实际上丢失了最后一位0)

const m3 = 9007199254740993;

推导过程,10进制转2进制转IEEE:

9007199254740993

= 1 * \(2^{53}\) + 1

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

符号位:正数 = 0

指数:指数 = 000 0011 0101

尾数:1 = 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000(最后一位溢出)

IEEE:0000 0011 0101 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

还原:

1 * \(2^{53}\)

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000(小数点右移53位)

= 9007199254740992(与期望值9007199254740993不同,最后一位1丢失)

const m4 = 9007199254740994;

9007199254740994

= 1 * \(2^{53}\) + 2

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010

符号位:正数 = 0

指数:指数 = 000 0011 0101

尾数:

1.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001(最后一位溢出)

IEEE:0000 0011 0101 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

还原:

1.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 001 * \(2^{53}\)

= 1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010(小数点右移53位)

= 9007199254740994(虽然与期望值9007199254740994相同,但是实际上丢失了最后一位0)

标签:0000,0011,53,JS,1111,丢失,const,IEEE,精度
From: https://www.cnblogs.com/ylc0x01/p/17340915.html

相关文章

  • 【汇智学堂】JSTL标签库-循环标签(forTokens)
    <c:forTokens>标签与JAVA语言中StringTokenizer类的作用相似,可以用指定的分隔符分离一个字符串,根据分隔的数量确定循环的次数。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c&......
  • 【汇智学堂】JSTL标签库-c标签中的out
    afterrun,likethis:basenolastarticle,out.jsp:<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%><!DOCTYPEHTMLPU......
  • 【汇智学堂】JSTL标签库-c标签中的remove
    remove.jsp:<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%><html><head><title><c:remove>......
  • jsoup将富文本转化为纯文本
    1.添加jar包<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version></dependency>2.测试publicstaticvoidmain(S......
  • js 时间格式化函数
    functiondateFormat(time,fmStr){constweekCN='一二三四五六日'constweekEN=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']letyear......
  • C# JSON简单测试
    1usingNewtonsoft.Json;2usingSystem;3usingSystem.Collections.Generic;4usingSystem.IO;5usingSystem.Text.Json.Serialization;67namespaceTestJSON8{9internalclassProgram10{11staticvoidMain(string[]args)1......
  • Three.js教程:顶点位置数据解析渲染
    推荐:将NSDT场景编辑器加入你3D工具链其他工具系列:NSDT简石数字孪生顶点位置数据解析渲染如果你没有WebGL基础,可以先不用记忆每个的threejs具体内容,有一个大致印象即可,学习本节课的重点是建立顶点的概念。如果你建立了顶点的概念,那么对于你深入理解学习Three.js很有帮助。如果......
  • 005 PPT 防止字体丢失
    方法一:字体矢量化即,使用形状通过布尔运算,将文字转为形状的操作方式操作步骤:插入形状==》选择文本+按住Ctrl+选择形状==》合并形状==》剪除(实现将文字转为形状)方法二:字体转图片选择文本==》剪切==》复制为图片方法三:嵌入字体即通过设置实现字体的嵌入,但不是所有字......
  • Node.js
     nodejs到底是什么?nodejs是一个开源的,跨平台的JavaScript运行环境;是JavaScript运行的平台,类似于浏览器。不是框架,不是库,也不是语言。通俗来说,就是一款应用程序,它可以运行JavaScript。运行平台:一般就是指一个代码的运行环境;作用是:开发者可以使用指定的编程语言,基于某个环境......
  • JS的对象比较,JS的数组比较
    1数组对比一、toString()当两个数组元素类型相同,顺序相同时,直接判断是否相等,结果不相等;转化为字符串后,结果相等[1,2,3].toString()===[1,2,3].toString();//true[1,2,3].toString()===['1',2,3].toString();//true二、join()[1,2,3,'4'].join()===[1,2,3,......