博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js基本数据类型 BigInt 和 Number 的区别
阅读量:5998 次
发布时间:2019-06-20

本文共 2000 字,大约阅读时间需要 6 分钟。

今天在做LeetCode的一到 “加一” 的题,题目如下

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。

我的代码是这样的,这还是优化过的

var plusOne = function(digits) {  for (let i = digits.length - 1; i >= 0; i--) {    if (digits[i] === 9) {      digits[i] = 0    } else {      digits[i]++      break    }  }  return (digits[0] === 0) ? [...[1], ...digits] : digits};

后来在答案区看到一位大神的代码只有一行

const plusOne = digits => {  return (BigInt(digits.join('')) + 1n).toString().split('');};

赶紧学习一下,

这个方法很巧妙,是把数组转化为数字计算后再转回数组

方法学习到了,但是为什么不能用Number呢,我测试了一下,当数字过大时,Number的问题就出现了

var plusOne1 = function(digits) {    (Number(digits.join(''))+1).toString().split('')    return digits};var plusOne2 = digits => {  return (BigInt(digits.join('')) + 1n).toString().split('');};plusOne1([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3])// [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]plusOne2([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3])// [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]再来下面的就更清晰了Number([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705000BigInt([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705543n

 为什么Number不行,BigInt就可以呢,我们来看一下BigInt的介绍

在JavaScript中的基本数据类Number是双精度浮点数,它可以表示的最大安全范围是正负9007199254740991,也就是2的53次方减一, 比253大的所有数字则可以使用BigInt表达。

BigInt是JavaScript中的一个新的原始类型,可以用任意精度表示整数。使用BigInt,即使超出JavaScript Number 的安全整数限制,也可以安全地存储和操作大整数。

chrome 67+开始支持BigInt。可以这样定义一个 BigInt 变量:在一个整数字面量后面加 n,如:10n,或者调用函数BigInt()

要创建一个BigInt,在数字后面添加n后缀即可,例如,123变成123n。全局BigInt(number)函数可以用来将Number转换成BigInt。换句话说,BigInt(123) === 123n

BigInt(value)。   //  value是创建对象的数值。可以是字符串或者整数。
const theBiggestInt = 9007199254740991n;const alsoHuge = BigInt(9007199254740991);// ↪ 9007199254740991nconst hugeButString = BigInt('9007199254740991');// ↪ 9007199254740991n

 

它在某些方面类似于  ,但是也有几个关键的不同点:不能和  对象中的方法一起使用;不能和任何  实例混合运算。

好了,现在你知道他们的区别在哪里了吗?如果工作中有对超大数字的计算,一定记得使用BigInt确保准确无误哦!

 

转载于:https://www.cnblogs.com/wuyuchao/p/10531024.html

你可能感兴趣的文章
VB.net数据库编程(03):一个SQLserver连接查询的简单样例
查看>>
C#(winform)设置窗口置顶
查看>>
[Mac A]如何学习Mac编程?
查看>>
Linux - expect自动化远程登录脚本
查看>>
shell语法简单介绍
查看>>
ARP缓存记录种类动态条目和静态条目
查看>>
Socket原理与编程基础(转)
查看>>
基于jquery的json转table插件jsontotable
查看>>
PEP8 Python 编码规范
查看>>
Linux的常用命令
查看>>
MyEclipse 6.5 代码自动提示功能配置教程
查看>>
Supports BorlandIDEServices
查看>>
C#中的多线程 - 同步基础 z
查看>>
javascript 次序li
查看>>
关于ibatis的实体类部分属性无法映射
查看>>
重构第21天 合并继承 (Collapse Hierarchy)
查看>>
Android 实现动态匹配输入的内容 AutoCompleteTextView和MultiAutoCompleteTextView
查看>>
垂直的SeekBar:VerticalSeekBar
查看>>
TortoiseGit日常使用指南
查看>>
文件管理[Linux]
查看>>