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

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

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

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

// 每一段最多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)

上一篇:SCVMM创建Linux虚拟机模版


下一篇:3.2使用PyTorch搭建AlexNet并训练花分类数据集