首页 > Web开发 > 详细

两个大整数的比较,包括超过16位精度的数字(js)

时间:2021-07-09 00:56:30      阅读:16      评论:0      收藏:0      [点我收藏+]

JS整数的精度是Math.pow(2,53),大于 9007199254740992 (16位数)的可能会丢失精度。所以对于大数字加减和比较,可以将数字拆分成多个15位数字,进行加减或比较。
比如后台返回一个18位的整数,直接取值会失去精度,当然也无法正常对比大小
技术分享图片

// json串里面的长整型使用bigInt转换成字符串
import JSONbig from ‘json-bigint‘
const result = JSONbig.parse(this.customData.attrVals)
max: result.max.toString(),

技术分享图片

// 每一段最多15位  如果有2段第一段从0 开始,第二段从str.length 开始
const getMidNum = (str:string, start:number, len:number) => {
  if (start + len > 0) {
    return +str.substr(start < 0 ? 0 : start, start < 0 ? start + len : len)
  } else {
    return 0
  }
}

/**
 * 比较两个大整数的大小,返回-1,0,1  a<b返回-1
 * @param {String} a
 * @param {String} b
 * @returns {number}
 */
const bigNumCompare = (a:string, b:string): number => {
  let back = 0
  // 取最大值分15份,向上取整
  let max = Math.ceil(Math.max(a.length, b.length) / 15)
  // 分成多少段,从左边开始
  for (let i = max; i > 0; i--) {
    let num1 = getMidNum(a, a.length - i * 15, 15)
    let num2 = getMidNum(b, b.length - i * 15, 15)
    // 15位数字相减
    let cur = num1 - num2
    if (cur < 0) {
      back = -1
      break
    } else if (cur > 0) {
      back = 1
      break
    }
  }
  return back
}

export { bigNumCompare }

两个大整数的比较,包括超过16位精度的数字(js)

原文:https://www.cnblogs.com/whkl-m/p/14987920.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!