前端BUG录- 科学记数法是什么?

简介: 科学记数法是一种记数的方法。 特性:精度丢失、节省空间

什么是科学计数法



把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数)。19971400000000 == 1.99714×10^13 == 1.99714e13


当我们要标记或运算某个较大或较小且位数较多时,用科学记数法免去浪费很多空间和时间。


问题起源



在一个群里,有个人问我:保留小数问题。经过一番排查是他没有处理科学计数法。


bVcH1mo.webp.jpg


JavaScript 能够准确表示的整数范围在 -2^532^53 之间(不含两个端点),超过这个范围,无法精确表示这个整数。


同样,因为存储规范的原因,小数也存在精度问题。


https://www.ecma-international.org/ecma-262/#sec-ecmascript-language-types-number-type

JavaScript 的 Number


JavaScript 的 Number 对象是经过封装的能让你处理数字值的对象。Number 对象由 Number() 构造器创建。

JavaScript 的 Number 类型为双精度IEEE 754 64位浮点类型。

最近出了 BigInt 任意精度数字类型,已经可以尝鲜了

安全数


  • Number.MAX_SAFE_INTEGER JavaScript 中最大的安全整数 (2**53 - 1)。


bVcH1r1.webp.jpg


  • Number.MAX_VALUE JavaScript 中能表示的最大正数。最小的负数是 -MAX_VALUE。


bVcH1sW.webp.jpg


  • Number.MIN_SAFE_INTEGER JavaScript 中能表示的最小的安全整数 (-(253 - 1))。


bVcH1ta.webp.jpg


  • Number.MIN_VALUE JavaScript 中能表示的最小正数即最接近 0 的正数 (实际上不会变成 0)。最大的负数是 -MIN_VALUE


bVcH1t1.webp.jpg


代码



function number2string(num){
    num = String(num)
    var eSplit = num.split('e')
    var e = +(eSplit[1] || 0)
    var pad = '0'.repeat(500)
    var numSplit = eSplit[0].split('.')
    var str
    var numSplit1 = numSplit[1] || ''
    if(e < 0){
        str = ('0.' + (pad + numSplit[0]).slice(e) + numSplit1)
    }else{
        str = (numSplit[0] + (numSplit1 + pad).slice(0,e) + '.' + numSplit1.slice(e))
    }
    return str.replace(/\.?0*$/,'').replace(/^0*/,'').replace(/^\./,'0.') || '0'
}
// number2string('1.23456789e-1')
// number2string('1.23456789e0')
// number2string('1.23456789e1')
arr = [];
for(var i = -20; i < 20; i++){
    arr.push(`1.23456789e${i}`)
    //arr.push(`0001.23456789000e${i}`)
    //arr.push(`00000.0000001e${i}`)
     //arr.push(`${i}`)
    //arr.push(`${.5 - Math.random()}`)
}
arr.forEach((v)=>{
    console.log(String(v).padEnd(30, ' '), number2string(v))
})


相关文章
|
8月前
|
前端开发 测试技术
你发现一个bug,如何定位这个是前端还是后端缺陷?建议收藏
你发现一个bug,如何定位这个是前端还是后端缺陷?建议收藏
353 0
|
7月前
|
前端开发 安全 程序员
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
46 0
|
7月前
|
Web App开发 前端开发 开发者
|
4月前
|
前端开发 安全 JavaScript
怎么判断bug是前端问题还是后端问题?
怎么判断bug是前端问题还是后端问题?
|
4月前
|
前端开发
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
74 0
|
4月前
|
JSON 缓存 前端开发
编写代码前,如何规避尽可能多的前端bug?
编写代码前,如何规避尽可能多的前端bug?
24 0
|
6月前
|
缓存 前端开发 JavaScript
前端Vue小项目的一个非常诡异离谱的"眼神不好"Bug
公司放假, 现在来提升自己的前端的技术, 想着使用饿了么UI搭建一个简单的页面, 并完成mock数据的获取, 一个小项目就好了....
53 0
|
7月前
|
前端开发 芯片
【芯片前端】“异步FIFO全解析”的BUG——格雷码连续性
【芯片前端】“异步FIFO全解析”的BUG——格雷码连续性
|
9月前
|
前端开发 API
【面试题】:前端怎么实现权限设计及遇到的bug
前端怎么实现权限设计及遇到的bug
127 0
|
10月前
|
前端开发 JavaScript
我发现了一个React、Vue等所有前端框架都存在的隐秘Bug?
我发现了一个React、Vue等所有前端框架都存在的隐秘Bug?