前端|前端 BUG 录 - 科学计数法是什么()
科学记数法是一种记数的方法。 特性:精度丢失、节省空间
什么是科学计数法
把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数)。19971400000000 == 1.99714×10^13 == 1.99714e13
当我们要标记或运算某个较大或较小且位数较多时,用科学记数法免去浪费很多空间和时间。
问题起源
在一个群里,有个人问我:保留小数问题。经过一番排查是他没有处理科学计数法。
文章图片
JavaScript 能够准确表示的整数范围在 -2^53
到 2^53
之间(不含两个端点),超过这个范围,无法精确表示这个整数。
同样,因为存储规范的原因,小数也存在精度问题。
https://www.ecma-international.org/ecma-262/#sec-ecmascript-language-types-number-typeJavaScript 的
Number
JavaScript 的
Number
对象是经过封装的能让你处理数字值的对象。Number
对象由 Number()
构造器创建。JavaScript 的
Number
类型为双精度IEEE 754 64位浮点类型。
最近出了
BigInt
任意精度数字类型,已经可以尝鲜了
安全数Number.MAX_SAFE_INTEGER
JavaScript 中最大的安全整数 (2**53 - 1
)。
文章图片
Number.MAX_VALUE
JavaScript 中能表示的最大正数。最小的负数是 -MAX_VALUE。
文章图片
Number.MIN_SAFE_INTEGER
JavaScript 中能表示的最小的安全整数 (-(253 - 1))。
文章图片
Number.MIN_VALUE
JavaScript 中能表示的最小正数即最接近 0 的正数 (实际上不会变成 0)。最大的负数是-MIN_VALUE
。
文章图片
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))
})
微信公众号:前端linong 【前端|前端 BUG 录 - 科学计数法是什么()】
文章图片
参考资料
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number
推荐阅读
- 20170612时间和注意力开销记录
- 子龙老师语录
- MediaRecorder前后摄像头同时录像
- opencv|opencv C++模板匹配的简单实现
- 丰盛派创始人安裘密语录
- 【剽悍读书营成长记录】2018年我收获了什么|【剽悍读书营成长记录】2018年我收获了什么 3357-小松
- Java|Java基础——数组
- Jsr303做前端数据校验
- 日知图录85——印度阿萨姆红茶
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片