js转换为数字超16位精度丢失及解决

做题时走捷径,用Number和parseInt转换字符串,碰巧遇到这个问题:

    console.log(Number('6145390195186705111'));

输出:6145390195186705000

16位之后的数字不能转换。

查资料,原因:在js中number类型有个最大值(安全值)。为9007199254740992,是2的53次方。如果超过这个值,那么js会出现不精确的问题。

描述:MAX_SAFE_INTEGER 是一个值为 9007199254740991的常量。因为Javascript的数字存储使用了IEEE 754中规定的双精度浮点数数据类型,而这一数据类型能够安全存储 -(2^53 - 1) 到 2^53 - 1 之间的数值(包含边界值)。

解决方法:Bigint。

Bigint是一种内置对象(如Array、Date等),它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。Bigint可以表示任意大的整数。可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值:

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

typeof 1n === 'bigint'; // true

于是我们刚才的问题就可以得到解决了:

​
const num= BigInt("6145390195186705111");
// ↪ 6145390195186705111n

这之后可以非常方便的用String(num)或者toString(num),转换为去掉n的字符串

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: JavaScriptJS)的精度丢失通常是由于浮点数在计算机内部表示时存在精度限制而导致的。要解决这个问题,可以采取以下方法: 1.使用整数运算 可以将浮点数转换为整数来避免精度丢失。例如,将货币金额乘以100并将其表示为整数,而不是直接使用浮点数表示。 2.使用专门的库 可以使用专门的库,如Big.js或Decimal.js等来处理高精度数值运算,这些库提供了更高的精度,并且可以处理大量数据运算,但需要在项目中引入外部库,会稍微增加项目的复杂度。 3.使用toFixed() 使用toFixed()方法来将浮点数转换为字符串表示,并保留指定的小数数。例如,使用toFixed(2)将浮点数保留两小数并转换为字符串。 4.比较两个浮点数时使用误差范围 在比较两个浮点数时,由于精度问题,直接使用等于(==)操作符比较可能会出现问题。可以使用一个误差范围来比较两个浮点数,例如: ``` function compare(a, b) { var eps = 0.0001; return Math.abs(a - b) < eps; } ``` 以上是几种常见的解决 JavaScript 精度丢失的方法。不同的方法可以根据具体情况进行选择和组合使用。 ### 回答2: 在JavaScript中,由于浮点数的特性,可能会出现精度丢失的问题。为了解决这个问题,可以采取以下措施: 1.使用整数进行计算:将需要进行精确计算的数字转换成整数进行计算,然后再将结果转回浮点数。这样可以避免浮点数运算过程中的精度丢失问题。 2.使用特定的计算库:可以使用一些专门用于处理精度需求的计算库,如Big.js、decimal.js等。这些库提供了精确计算的功能,能够避免JavaScript本身的精度丢失问题。 3.避免连续运算:尽量避免在一个计算中多次进行浮点数运算,因为每次运算都可能引起精度丢失。可以将计算拆分成多个步骤,将结果保存在中间变量中,以避免精度丢失的累积效应。 4.四舍五入:在某些情况下,可以使用四舍五入来确保结果的精度。可以使用toFixed()方法将浮点数保留指定数的小数,并按照四舍五入规则进行近似。 总结来说,解决JavaScript精度丢失问题的方法主要包括使用整数计算、借助特定的计算库、避免连续运算和进行四舍五入等。根据具体的业务需求和场景,选择合适的方法来解决精度丢失问题。 ### 回答3: 在JavaScript中,由于浮点数的二进制表示方式,会出现精度丢失的问题。然而,我们可以采取以下几种方法来解决这个问题: 1. 使用整数运算:将小数转换为整数进行计算,最后再将结果转换回小数。通过使用整数,可以避免浮点数精度丢失的问题。例如,将小数乘以100,然后进行计算,最后再除以100来恢复小数。 2. 使用JavaScript库:有一些专门的JavaScript库,比如Decimal.js和Big.js,可以提供高精度计算的功能。这些库可以用于执行算术运算,并提供更准确的结果。 3. 使用toFixed()函数:JavaScript中的toFixed()函数可以用来限制小数的数。该函数将返回一个指定小数数的字符串表示形式。通过使用toFixed()函数,我们可以控制小数的数,从而减少精度丢失的概率。 4. 避免多次计算:如果需要进行多次计算,应该尽量减少中间结果的运算,可以将中间结果保存在变量中,以减少精度丢失的发生。 总之,在JavaScript解决精度丢失的问题,可以使用整数运算、JavaScript库、toFixed()函数以及减少多次计算等方法。根据具体的应用场景选择合适的方法,以保证计算结果的准确性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值