@kensoni/big-number
Version:
Handle the big number
334 lines (333 loc) • 11.2 kB
JavaScript
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);
}