当前位置: 首页 > 知识库问答 >
问题:

javascript - js 字符串转整数 然后在+百万的数 为什么计算结果会出错?

轩辕季同
2024-04-04

3825567180763585000 + 100万 200万 300万的时候计算结果都是正常的 为什么
+400万的时候 计算结果就出错了3825567180767585300
image.png
怎么保证计算正确性 谢谢

共有4个答案

仲和韵
2024-04-04

3825567180763585000 已经超出了 number 类型最大的安全整数(2^53-1)

Number.isSafeInteger(3825567180763585000) // log => false

所以改用成 BigInt 就可以了。或者使用一些第三方的大数运算库,比如说 big.js 来处理大数运算。

徐安康
2024-04-04

用 BigInt

console.log(3825567180763585000n + 4000000n)// 3825567180767585000n
鲜于岳
2024-04-04

了解下关于安全整数的概念

  • 安全整数: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...
  • 最大的安全整数(2^53 – 1): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...
  • 最小的安全整数(-2^53 – 1): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...

保证不出错的办法

  • 使用bignumber这个库: https://www.npmjs.com/package/bignumber.js

    /** * JavaScript中的加减乘除的精度的问题 * 基于bignumber.js */ const BigNumber = require('bignumber.js')class MyBigNumber {/** * 加法 用例: 0.1 + 0.2 ?= 0.3 */static plus(a, b) {  const r = new BigNumber(a).plus(b)   // @Test Logger  console.log(`【加法】-处理前:${a + b}, 处理后:${r}`)   return +r.toString()} /** * 减法 用例:0.12 - 0.1 ?= 0.02 */static minus(a, b) {  const r = new BigNumber(a).minus(b)   // @Test Logger  console.log(`【减法】-处理前:${a - b}, 处理后:${r}`)   return +r.toString()} /** * 乘法 用例:1.15 * 100 ?= 115 */static mul(a, b) {  const r = new BigNumber(a).multipliedBy(b)   // @Test Logger  console.log(`【乘法】-处理前:${a * b}, 处理后:${r}`)   return +r.toString()} /** * 除法 用例: 0.15 / 0.1 ?= 1.5 */static div(a, b) {  const r = new BigNumber(a).dividedBy(b)   // @Test Logger  console.log(`【除法】-处理前:${a / b}, 处理后:${r} `)   return +r.toString()}}
唐高朗
2024-04-04

超出最大整数就会出现不正常的结果,首先了解下BigInt,就是为了解决这个问题

BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值.在对大整数执行数学运算时,以任意精度表示整数的能力尤为重要,使用BigInt,整数溢出将不再是问题.

最大整数: Number.MAX_SAFE_INTEGER -> 9007199254740991

最小整数: Number.MIN_SAFE_INTEGER -> -9007199254740991

创建:BigInt("9007199254740995"); // → 9007199254740995n

//不使用BigInt返回结果是异常的9007199254740992 === 9007199254740993   true//使用BigInt返回结果是正常的9007199254740992n === 9007199254740993n  falseBigInt("9007199254740995") + BigInt("9007199254740995")=18014398509481990nNumber(18014398509481990n) = 18014398509481990
 类似资料:
  • 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽

  • 问题内容: 如何在JavaScript中将字符串转换为整数? 问题答案: 最简单的方法是使用本机函数: 如果这对您不起作用,则有 parseInt , 一元加号 , 带有floor的parseFloat 和 Math.round 方法。 parseInt: 一元加号,如果您的字符串已经是整数形式: 如果您的字符串是浮点数或可能是浮点数,并且您想要一个整数: 或者,如果您要多次使用Math.floo

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字

  • 问题内容: 这是我的数据库的快照。 col1和col2都声明为int。 我的ComputedColumn当前添加列1和2,如下所示… 取而代之的是,我的ComputedColumn应该将列1和2(在中间包含 ’-‘ 字符)连接起来,如下所示… 那么,正确的语法是什么? 问题答案: 您可能将计算列定义为。试试吧。 或者,如果您愿意,可以替换为或选择其他长度。

  • 所以我在做一个方法,用10000到55555的数字填充一个字符串。这些数字在6位数系统中。这意味着当我们有10005时,下一个数字是10010和11555- 我做了一个for循环,用所有数字填充字符串,但我不知道如何找到3 og更相等的数字。我想我需要另一个带有If语句的for循环,但我只是不明白。尝试同时使用 char 和 int 进行循环,但我显然做错了什么。 这是我目前掌握的情况: 有什么想

  • 本文向大家介绍如何在JavaScript中将字符串转换为整数?,包括了如何在JavaScript中将字符串转换为整数?的使用技巧和注意事项,需要的朋友参考一下 到转换 一个字符串 到整数 parseInt函数() 函数中使用的JavaScript。当字符串不包含数字时,parseInt()函数将返回Nan(不是数字)。如果发送带有数字的字符串,则仅该数字将作为输出返回。此函数将不接受空格。如果发送