js数据类型BigInt

JavaScript017

js数据类型BigInt,第1张

BigInt 数据类型的目的是比 Number 数据类型支持的范围更大的整数值。

BigInt构造函数:

Number 类型只能安全地表示-9007199254740991 ( -(2^53-1 )) 和9007199254740991( 2^53-1 )之间的整数

JS 提供 Number.MAX_SAFE_INTEGER 常量来表示 最大安全整数, Number.MIN_SAFE_INTEGER 常量表示最小安全整数:

不能使用严格相等运算符将 BigInt 与常规数字进行比较,因为它们的类型不同:

与 BigInt 操作数一起使用时,算术运算符应该返回 BigInt 值。因此,除法 (/) 运算符的结果会自动向下舍入到最接近的整数。例如:

BigInt和Number 执行算术计算,首先需要确定应该在哪个类型中执行该操作。为此,只需通过调用 Number()或BigInt() 来转换操作数:

当 Boolean 类型与 BigInt 类型相遇时, BigInt 的处理方式与 Number 类似,换句话说,只要不是 0n ,BigInt就被视为 truthy 的值:

位操作符如 |、&、<<、>>和^ 对 Bigint 的操作方式与 Number类似 。下面是一些例子

不能使用 Number 和 BigInt 操作数的 混合执行算术运算 ,需要通过显式转换其中的一种类型。 此外,出于兼容性原因,不允许在 BigInt 上使用一元加号 (+) 运算符。

在新公司的第一个项目是区块链相关的管理后台和交易所,其中就涉及了很多的计算问题。而JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。

至于为什么JavaScript会有精度问题呢,可以看 这里 。简单来说就是因为: JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。

BigNumber.js是一个用于任意精度计算的js库。可以在  官方文档  的console中测试使用。也可以通过npm install bignumber.js --save来安装。然后 import BigNumber from 'bignumber.js' 来引入使用。他的大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。

现在 TC39 已经有一个 Stage 3 的提案 proposal bigint,大数问题有望彻底解决。在浏览器正式支持前,可以使用 Babel 7.0 来实现,它的内部是自动转换成 big-integer 来计算,要注意的是这样能保持精度但运算效率会降低。

具体用法可以参考以下资料:

官方文档

bignumber.js使用记录

BigNumber 讲解

就不再敖述了,下边随便写点常用的方法:

// 转为 bignumberconstx=newBigNumber('123456789.123456789')// 转为 普通数字x.toNumber()// 格式化(小数点)x.toFormat()// '123,456,789.123456789'x.toFormat(3)// '123,456,789.123'// 计算x.plus(0.1)// 加法x.minus(0.1)// 减法x.times(0.1)// 乘法x.div(0.1)// 除法x.mod(3)// 取模/取余// 比较大小x.eq(y)// isEqualTo 的简写,是否相等x.gt(y)// isGreaterThan 的简写,是否大于x.gte(y)// isGreaterThanOrEqualTo 的简写,是否大于等于x.lt(y)// isLessThan 的简写,是否小于x.lte(y)// isLessThanOrEqualTo 的简写,是否小于等于// 取非,改变数字的正负号x.negated()

只需要一句,arr.__proto__=[]但是要注意浏览器支持__proto__才行,最新的浏览器应该都支持。

以下两种都可以解决此问题:

function transform(obj){

var arr = []

for(var item in obj){

arr.push(obj[item])

}

return arr

}

或者

public static void main(String[] args) {

String [] s={"2","3","4"}

int [] array=new int[3]

for(int i=0i<s.lengthi++){

array[i]=Integer.parseInt(s[i])

System.out.println(array[i])

}

}