UNPKG

@kensoni/big-number

Version:

Handle the big number

334 lines (333 loc) 11.2 kB
function isDec(dec) { return dec !== '0' && dec !== '' && dec !== undefined; } export function aEqualB(a, b) { var _a = a.split('.'), intA = _a[0], decA = _a[1], _c = b.split('.'), intB = _c[0], decB = _c[1]; var aNeg = intA.startsWith('-'), bNeg = intB.startsWith('-'); if ((aNeg && !bNeg) || (!aNeg && bNeg)) return false; intA = intA.replace('-', ''); intB = intB.replace('-', ''); if (intA.length !== intB.length) return false; for (var i = 0; i < intA.length; i++) { if (parseInt(intA[i]) !== parseInt(intB[i])) return false; } if (!isDec(decA) && !isDec(decB)) return true; if (!isDec(decA) || !isDec(decB)) return false; if (decA.length !== decB.length) return false; for (var i = 0; i < decA.length; i++) { if (parseInt(decA[i]) !== parseInt(decB[i])) return false; } return true; } export function aLessThanB(a, b) { var _a = a.split('.'), intA = _a[0], decA = _a[1], _c = b.split('.'), intB = _c[0], decB = _c[1]; var aNeg = intA.startsWith('-'), bNeg = intB.startsWith('-'); if (aNeg && !bNeg) return true; if (!aNeg && bNeg) return false; if (intB.length < intA.length) return aNeg; if (intB.length > intA.length) return !aNeg; for (var i = 0; i < intA.length; i++) { if (parseInt(intB[i]) < parseInt(intA[i])) return aNeg; if (parseInt(intB[i]) > parseInt(intA[i])) return !aNeg; } if (!isDec(decB) && !isDec(decA)) return false; if (!isDec(decB)) return false; if (!isDec(decA)) return true; var length = Math.min(decA.length, decB.length); for (var i = 0; i < length; i++) { if (parseInt(decB[i]) < parseInt(decA[i])) return aNeg; if (parseInt(decB[i]) > parseInt(decA[i])) return !aNeg; } if (decB.length < decA.length) return aNeg; if (decB.length > decA.length) return !aNeg; return false; } export function aLessThanOrEqualB(a, b) { var _a = a.split('.'), intA = _a[0], decA = _a[1], _c = b.split('.'), intB = _c[0], decB = _c[1]; var aNeg = intA.startsWith('-'), bNeg = intB.startsWith('-'); if (aNeg && !bNeg) return true; if (!aNeg && bNeg) return false; if (intB.length < intA.length) return aNeg; if (intB.length > intA.length) return !aNeg; for (var i = 0; i < intA.length; i++) { if (parseInt(intB[i]) < parseInt(intA[i])) return aNeg; if (parseInt(intB[i]) > parseInt(intA[i])) return !aNeg; } if (!isDec(decB) && !isDec(decA)) return true; if (!isDec(decB)) return false; if (!isDec(decA)) return true; var length = Math.min(decA.length, decB.length); for (var i = 0; i < length; i++) { if (parseInt(decB[i]) < parseInt(decA[i])) return aNeg; if (parseInt(decB[i]) > parseInt(decA[i])) return !aNeg; } if (decB.length < decA.length) return aNeg; if (decB.length > decA.length) return !aNeg; return true; } export function aGreaterThanB(a, b) { var _a = a.split('.'), intA = _a[0], decA = _a[1], _c = b.split('.'), intB = _c[0], decB = _c[1]; var aNeg = intA.startsWith('-'), bNeg = intB.startsWith('-'); if (aNeg && !bNeg) return false; if (!aNeg && bNeg) return true; if (intB.length > intA.length) return aNeg; if (intB.length < intA.length) return !aNeg; for (var i = 0; i < intA.length; i++) { if (parseInt(intB[i]) > parseInt(intA[i])) return aNeg; if (parseInt(intB[i]) < parseInt(intA[i])) return !aNeg; } if (!isDec(decB) && !isDec(decA)) return false; if (!isDec(decB)) return true; if (!isDec(decA)) return false; var length = Math.min(decA.length, decB.length); for (var i = 0; i < length; i++) { if (parseInt(decB[i]) > parseInt(decA[i])) return aNeg; if (parseInt(decB[i]) < parseInt(decA[i])) return !aNeg; } if (decB.length > decA.length) return aNeg; if (decB.length < decA.length) return !aNeg; return false; } export function aGreaterThanOrEqualB(a, b) { var _a = a.split('.'), intA = _a[0], decA = _a[1], _c = b.split('.'), intB = _c[0], decB = _c[1]; var aNeg = intA.startsWith('-'), bNeg = intB.startsWith('-'); if (aNeg && !bNeg) return false; if (!aNeg && bNeg) return true; if (intB.length > intA.length) return aNeg; if (intB.length < intA.length) return !aNeg; for (var i = 0; i < intA.length; i++) { if (parseInt(intB[i]) > parseInt(intA[i])) return aNeg; if (parseInt(intB[i]) < parseInt(intA[i])) return !aNeg; } if (!isDec(decB) && !isDec(decA)) return true; if (!isDec(decB)) return true; if (!isDec(decA)) return false; var length = Math.min(decA.length, decB.length); for (var i = 0; i < length; i++) { if (parseInt(decB[i]) > parseInt(decA[i])) return aNeg; if (parseInt(decB[i]) < parseInt(decA[i])) return !aNeg; } if (decB.length > decA.length) return aNeg; if (decB.length < decA.length) return !aNeg; return true; } export function addABPositive(a, b) { var _a, _c, _d, _e; var _f = a.split('.'), intA = _f[0], decA = _f[1], _g = b.split('.'), intB = _g[0], decB = _g[1]; var dec = '', int = '', surplus = false; if (!isDec(decB)) { dec = decA !== null && decA !== void 0 ? decA : ''; } else if (!isDec(decA)) { dec = decB !== null && decB !== void 0 ? decB : ''; } else { var max_1 = Math.max(decA.length, decB.length); for (var i = max_1 - 1; i >= 0; i--) { var charA = parseInt((_a = decA[i]) !== null && _a !== void 0 ? _a : '0'), charB = parseInt((_c = decB[i]) !== null && _c !== void 0 ? _c : '0'); var char = charA + charB; if (surplus) { char += 1; surplus = false; } if (char > 9) { char -= 10; surplus = true; } dec = char + dec; } } var aLength = intA.length, bLength = intB.length, max = Math.max(aLength, bLength); for (var i = 0; i < max; i++) { var charA = parseInt((_d = intA[aLength - i - 1]) !== null && _d !== void 0 ? _d : '0'), charB = parseInt((_e = intB[bLength - i - 1]) !== null && _e !== void 0 ? _e : '0'); var char = charA + charB; if (surplus) { char += 1; surplus = false; } if (char > 9) { char -= 10; surplus = true; } int = char + int; } if (surplus) int = 1 + int; return "".concat(int, ".").concat(dec).replace(/\.$/, ''); } export function addABNegative(a, b) { return '-' + addABPositive(a.replace('-', ''), b.replace('-', '')); } export function addAPositiveBNegative(a, b) { var _b = b.replace('-', ''); if (aEqualB(a, _b)) return '0'; if (aLessThanB(a, _b)) return '-' + minusAGreaterThanBPositive(_b, a); return minusAGreaterThanBPositive(a, _b); } export function addANegativeBPositive(a, b) { return addAPositiveBNegative(b, a); } export function add(a, b) { if (a.startsWith('-')) { if (b.startsWith('-')) { return addABNegative(a, b); } else { return addANegativeBPositive(a, b); } } else if (b.startsWith('-')) { return addAPositiveBNegative(a, b); } else { return addABPositive(a, b); } } export function minusAGreaterThanBPositive(a, b) { var _a, _c, _d; var _e = a.split('.'), intA = _e[0], _f = _e[1], decA = _f === void 0 ? '' : _f, _g = b.split('.'), intB = _g[0], _h = _g[1], decB = _h === void 0 ? '' : _h, dec = '', int = '', borrow = false; if (!isDec(decB)) { dec = decA; } else { var max = Math.max(decA.length, decB.length); for (var i = max - 1; i >= 0; i--) { var char1 = parseInt((_a = decA[i]) !== null && _a !== void 0 ? _a : '0'), char2 = parseInt((_c = decB[i]) !== null && _c !== void 0 ? _c : '0'); if (borrow) { char2 += 1; borrow = false; } if (char1 < char2) { char1 += 10; borrow = true; } dec = (char1 - char2) + dec; } } var aLength = intA.length, bLength = intB.length; for (var i = 0; i < aLength; i++) { var char1 = parseInt(intA[aLength - i - 1]), char2 = parseInt((_d = intB[bLength - i - 1]) !== null && _d !== void 0 ? _d : '0'); if (borrow) { char2 += 1; borrow = false; } if (char1 < char2) { char1 += 10; borrow = true; } int = (char1 - char2) + int; } return "".concat(int, ".").concat(dec).replace(/\.$/, ''); } export function minusAGreaterThanBNegative(a, b) { return minusAGreaterThanBPositive(b.replace('-', ''), a.replace('-', '')); } export function minusALessThanBPositive(a, b) { return '-' + minusAGreaterThanBPositive(b, a); } export function minusALessThanBNegative(a, b) { return '-' + minusAGreaterThanBPositive(a.replace('-', ''), b.replace('-', '')); } export function minusAPositiveBNagetive(a, b) { return addABPositive(a, b.replace('-', '')); } export function minusANegativeBPositive(a, b) { return '-' + addABPositive(a.replace('-', ''), b); } function multiplicationWithSingle(a, b) { var rs = '', temp = 0; var _b = parseInt(b); for (var i = a.length; i > 0; i--) { var char = parseInt(a[i - 1]) * _b + temp, c = char; temp = 0; if (char > 9) { c = char % 10; temp = (char - c) * .1; } rs = c + rs; } if (temp > 0) rs = temp + rs; return rs; } export function multiplication(a, b) { var aNeg = a.startsWith('-'), bNeg = b.startsWith('-'), isDecA = a.includes('.'), isDecB = b.includes('.'); var valA = a.replace(/^-?0*/, ''), valB = b.replace(/^-?0*/, ''); if (isDecA) valA = valA.replace(/0*$/, ''); if (isDecB) valB = valB.replace(/0*$/, ''); var lengthDecA = isDecA ? valA.length - valA.indexOf('.') - 1 : 0, lengthDecB = isDecB ? valB.length - valB.indexOf('.') - 1 : 0, sumDec = lengthDecA + lengthDecB; valA = valA.replace('.', ''); valB = valB.replace('.', ''); var rs = '', length = a.length; for (var i = 0; i < length; i++) { rs = addABPositive(rs, multiplicationWithSingle(b, a[length - i - 1]) + '0'.repeat(i)); } if (sumDec) { rs = [rs.substring(0, rs.length - sumDec), rs.substring(rs.length - sumDec)].join('.'); } var neg = (aNeg && !bNeg) || (!aNeg && bNeg); return "".concat(neg ? '-' : '').concat(rs); }