js-big-decimal.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. var bigDecimal =
  2. /******/ (function(modules) { // webpackBootstrap
  3. /******/ // The module cache
  4. /******/ var installedModules = {};
  5. /******/
  6. /******/ // The require function
  7. /******/ function __webpack_require__(moduleId) {
  8. /******/
  9. /******/ // Check if module is in cache
  10. /******/ if(installedModules[moduleId]) {
  11. /******/ return installedModules[moduleId].exports;
  12. /******/ }
  13. /******/ // Create a new module (and put it into the cache)
  14. /******/ var module = installedModules[moduleId] = {
  15. /******/ i: moduleId,
  16. /******/ l: false,
  17. /******/ exports: {}
  18. /******/ };
  19. /******/
  20. /******/ // Execute the module function
  21. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  22. /******/
  23. /******/ // Flag the module as loaded
  24. /******/ module.l = true;
  25. /******/
  26. /******/ // Return the exports of the module
  27. /******/ return module.exports;
  28. /******/ }
  29. /******/
  30. /******/
  31. /******/ // expose the modules object (__webpack_modules__)
  32. /******/ __webpack_require__.m = modules;
  33. /******/
  34. /******/ // expose the module cache
  35. /******/ __webpack_require__.c = installedModules;
  36. /******/
  37. /******/ // define getter function for harmony exports
  38. /******/ __webpack_require__.d = function(exports, name, getter) {
  39. /******/ if(!__webpack_require__.o(exports, name)) {
  40. /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
  41. /******/ }
  42. /******/ };
  43. /******/
  44. /******/ // define __esModule on exports
  45. /******/ __webpack_require__.r = function(exports) {
  46. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  47. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  48. /******/ }
  49. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  50. /******/ };
  51. /******/
  52. /******/ // create a fake namespace object
  53. /******/ // mode & 1: value is a module id, require it
  54. /******/ // mode & 2: merge all properties of value into the ns
  55. /******/ // mode & 4: return value when already ns object
  56. /******/ // mode & 8|1: behave like require
  57. /******/ __webpack_require__.t = function(value, mode) {
  58. /******/ if(mode & 1) value = __webpack_require__(value);
  59. /******/ if(mode & 8) return value;
  60. /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  61. /******/ var ns = Object.create(null);
  62. /******/ __webpack_require__.r(ns);
  63. /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  64. /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  65. /******/ return ns;
  66. /******/ };
  67. /******/
  68. /******/ // getDefaultExport function for compatibility with non-harmony modules
  69. /******/ __webpack_require__.n = function(module) {
  70. /******/ var getter = module && module.__esModule ?
  71. /******/ function getDefault() { return module['default']; } :
  72. /******/ function getModuleExports() { return module; };
  73. /******/ __webpack_require__.d(getter, 'a', getter);
  74. /******/ return getter;
  75. /******/ };
  76. /******/
  77. /******/ // Object.prototype.hasOwnProperty.call
  78. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  79. /******/
  80. /******/ // __webpack_public_path__
  81. /******/ __webpack_require__.p = "";
  82. /******/
  83. /******/
  84. /******/ // Load entry module and return exports
  85. /******/ return __webpack_require__(__webpack_require__.s = 3);
  86. /******/ })
  87. /************************************************************************/
  88. /******/ ([
  89. /* 0 */
  90. /***/ (function(module, exports, __webpack_require__) {
  91. "use strict";
  92. Object.defineProperty(exports, "__esModule", { value: true });
  93. //function add {
  94. function add(number1, number2) {
  95. var _a;
  96. if (number2 === void 0) { number2 = "0"; }
  97. var neg = 0, ind = -1, neg_len;
  98. //check for negatives
  99. if (number1[0] == '-') {
  100. neg++;
  101. ind = 1;
  102. number1 = number1.substring(1);
  103. neg_len = number1.length;
  104. }
  105. if (number2[0] == '-') {
  106. neg++;
  107. ind = 2;
  108. number2 = number2.substring(1);
  109. neg_len = number2.length;
  110. }
  111. number1 = trim(number1);
  112. number2 = trim(number2);
  113. _a = pad(trim(number1), trim(number2)), number1 = _a[0], number2 = _a[1];
  114. if (neg == 1) {
  115. if (ind == 1)
  116. number1 = compliment(number1);
  117. else
  118. number2 = compliment(number2);
  119. }
  120. var res = addCore(number1, number2);
  121. if (!neg)
  122. return trim(res);
  123. else if (neg == 2)
  124. return ('-' + trim(res));
  125. else {
  126. if (number1.length < (res.length))
  127. return trim(res.substring(1));
  128. else
  129. return ('-' + trim(compliment(res)));
  130. }
  131. }
  132. exports.add = add;
  133. function compliment(number) {
  134. var s = '', l = number.length, dec = number.split('.')[1], ld = dec ? dec.length : 0;
  135. for (var i = 0; i < l; i++) {
  136. if (number[i] >= '0' && number[i] <= '9')
  137. s += (9 - parseInt(number[i]));
  138. else
  139. s += number[i];
  140. }
  141. var one = (ld > 0) ? ('0.' + (new Array(ld)).join('0') + '1') : '1';
  142. return addCore(s, one);
  143. }
  144. function trim(number) {
  145. var parts = number.split('.');
  146. if (!parts[0])
  147. parts[0] = '0';
  148. while (parts[0][0] == '0' && parts[0].length > 1)
  149. parts[0] = parts[0].substring(1);
  150. return parts[0] + (parts[1] ? ('.' + parts[1]) : '');
  151. }
  152. exports.trim = trim;
  153. function pad(number1, number2) {
  154. var parts1 = number1.split('.'), parts2 = number2.split('.');
  155. //pad integral part
  156. var length1 = parts1[0].length, length2 = parts2[0].length;
  157. if (length1 > length2) {
  158. parts2[0] = (new Array(Math.abs(length1 - length2) + 1)).join('0') + (parts2[0] ? parts2[0] : '');
  159. }
  160. else {
  161. parts1[0] = (new Array(Math.abs(length1 - length2) + 1)).join('0') + (parts1[0] ? parts1[0] : '');
  162. }
  163. //pad fractional part
  164. length1 = parts1[1] ? parts1[1].length : 0,
  165. length2 = parts2[1] ? parts2[1].length : 0;
  166. if (length1 || length2) {
  167. if (length1 > length2) {
  168. parts2[1] = (parts2[1] ? parts2[1] : '') + (new Array(Math.abs(length1 - length2) + 1)).join('0');
  169. }
  170. else {
  171. parts1[1] = (parts1[1] ? parts1[1] : '') + (new Array(Math.abs(length1 - length2) + 1)).join('0');
  172. }
  173. }
  174. number1 = parts1[0] + ((parts1[1]) ? ('.' + parts1[1]) : '');
  175. number2 = parts2[0] + ((parts2[1]) ? ('.' + parts2[1]) : '');
  176. return [number1, number2];
  177. }
  178. exports.pad = pad;
  179. function addCore(number1, number2) {
  180. var _a;
  181. _a = pad(number1, number2), number1 = _a[0], number2 = _a[1];
  182. var sum = '', carry = 0;
  183. for (var i = number1.length - 1; i >= 0; i--) {
  184. if (number1[i] === '.') {
  185. sum = '.' + sum;
  186. continue;
  187. }
  188. var temp = parseInt(number1[i]) + parseInt(number2[i]) + carry;
  189. sum = (temp % 10) + sum;
  190. carry = Math.floor(temp / 10);
  191. }
  192. return carry ? (carry.toString() + sum) : sum;
  193. }
  194. /***/ }),
  195. /* 1 */
  196. /***/ (function(module, exports, __webpack_require__) {
  197. "use strict";
  198. Object.defineProperty(exports, "__esModule", { value: true });
  199. var roundingModes_1 = __webpack_require__(2);
  200. /**
  201. *
  202. * @param input the number to round
  203. * @param n precision
  204. * @param mode Rounding Mode
  205. */
  206. function roundOff(input, n, mode) {
  207. if (n === void 0) { n = 0; }
  208. if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; }
  209. if (mode === roundingModes_1.RoundingModes.UNNECESSARY) {
  210. throw new Error("UNNECESSARY Rounding Mode has not yet been implemented");
  211. }
  212. if (typeof (input) == 'number')
  213. input = input.toString();
  214. var neg = false;
  215. if (input[0] === '-') {
  216. neg = true;
  217. input = input.substring(1);
  218. }
  219. var parts = input.split('.'), partInt = parts[0], partDec = parts[1];
  220. //handle case of -ve n: roundOff(12564,-2)=12600
  221. if (n < 0) {
  222. n = -n;
  223. if (partInt.length <= n)
  224. return '0';
  225. else {
  226. var prefix = partInt.substr(0, partInt.length - n);
  227. input = prefix + '.' + partInt.substr(partInt.length - n) + partDec;
  228. prefix = roundOff(input, 0, mode);
  229. return (neg ? '-' : '') + prefix + (new Array(n + 1).join('0'));
  230. }
  231. }
  232. // handle case when integer output is desired
  233. if (n == 0) {
  234. var l = partInt.length;
  235. if (greaterThanFive(parts[1], partInt, neg, mode)) {
  236. return (neg ? '-' : '') + increment(partInt);
  237. }
  238. return (neg ? '-' : '') + partInt;
  239. }
  240. // handle case when n>0
  241. if (!parts[1]) {
  242. return (neg ? '-' : '') + partInt + '.' + (new Array(n + 1).join('0'));
  243. }
  244. else if (parts[1].length < n) {
  245. return (neg ? '-' : '') + partInt + '.' + parts[1] + (new Array(n - parts[1].length + 1).join('0'));
  246. }
  247. partDec = parts[1].substring(0, n);
  248. var rem = parts[1].substring(n);
  249. if (rem && greaterThanFive(rem, partDec, neg, mode)) {
  250. partDec = increment(partDec);
  251. if (partDec.length > n) {
  252. return increment(partInt, parseInt(partDec[0])) + '.' + partDec.substring(1);
  253. }
  254. }
  255. return (neg ? '-' : '') + partInt + '.' + partDec;
  256. }
  257. exports.roundOff = roundOff;
  258. function greaterThanFive(part, pre, neg, mode) {
  259. if (!part || part === new Array(part.length + 1).join('0'))
  260. return false;
  261. // #region UP, DOWN, CEILING, FLOOR
  262. if (mode === roundingModes_1.RoundingModes.DOWN || (!neg && mode === roundingModes_1.RoundingModes.FLOOR) ||
  263. (neg && mode === roundingModes_1.RoundingModes.CEILING))
  264. return false;
  265. if (mode === roundingModes_1.RoundingModes.UP || (neg && mode === roundingModes_1.RoundingModes.FLOOR) ||
  266. (!neg && mode === roundingModes_1.RoundingModes.CEILING))
  267. return true;
  268. // #endregion
  269. // case when part !== five
  270. var five = '5' + (new Array(part.length).join('0'));
  271. if (part > five)
  272. return true;
  273. else if (part < five)
  274. return false;
  275. // case when part === five
  276. switch (mode) {
  277. case roundingModes_1.RoundingModes.HALF_DOWN: return false;
  278. case roundingModes_1.RoundingModes.HALF_UP: return true;
  279. case roundingModes_1.RoundingModes.HALF_EVEN:
  280. default: return (parseInt(pre[pre.length - 1]) % 2 == 1);
  281. }
  282. }
  283. function increment(part, c) {
  284. if (c === void 0) { c = 0; }
  285. if (!c)
  286. c = 1;
  287. if (typeof (part) == 'number')
  288. part.toString();
  289. var l = part.length - 1, s = '';
  290. for (var i = l; i >= 0; i--) {
  291. var x = parseInt(part[i]) + c;
  292. if (x == 10) {
  293. c = 1;
  294. x = 0;
  295. }
  296. else {
  297. c = 0;
  298. }
  299. s += x;
  300. }
  301. if (c)
  302. s += c;
  303. return s.split('').reverse().join('');
  304. }
  305. /***/ }),
  306. /* 2 */
  307. /***/ (function(module, exports, __webpack_require__) {
  308. "use strict";
  309. Object.defineProperty(exports, "__esModule", { value: true });
  310. var RoundingModes;
  311. (function (RoundingModes) {
  312. /**
  313. * Rounding mode to round towards positive infinity.
  314. */
  315. RoundingModes[RoundingModes["CEILING"] = 0] = "CEILING";
  316. /**
  317. * Rounding mode to round towards zero.
  318. */
  319. RoundingModes[RoundingModes["DOWN"] = 1] = "DOWN";
  320. /**
  321. * Rounding mode to round towards negative infinity.
  322. */
  323. RoundingModes[RoundingModes["FLOOR"] = 2] = "FLOOR";
  324. /**
  325. * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,
  326. * in which case round down.
  327. */
  328. RoundingModes[RoundingModes["HALF_DOWN"] = 3] = "HALF_DOWN";
  329. /**
  330. * Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant,
  331. * in which case, round towards the even neighbor.
  332. */
  333. RoundingModes[RoundingModes["HALF_EVEN"] = 4] = "HALF_EVEN";
  334. /**
  335. * Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,
  336. * in which case round up.
  337. */
  338. RoundingModes[RoundingModes["HALF_UP"] = 5] = "HALF_UP";
  339. /**
  340. * Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
  341. * UNIMPLEMENTED
  342. */
  343. RoundingModes[RoundingModes["UNNECESSARY"] = 6] = "UNNECESSARY";
  344. /**
  345. * Rounding mode to round away from zero.
  346. */
  347. RoundingModes[RoundingModes["UP"] = 7] = "UP";
  348. })(RoundingModes = exports.RoundingModes || (exports.RoundingModes = {}));
  349. /***/ }),
  350. /* 3 */
  351. /***/ (function(module, exports, __webpack_require__) {
  352. "use strict";
  353. var add_1 = __webpack_require__(0);
  354. var round_1 = __webpack_require__(1);
  355. var multiply_1 = __webpack_require__(4);
  356. var divide_1 = __webpack_require__(5);
  357. var compareTo_1 = __webpack_require__(6);
  358. var subtract_1 = __webpack_require__(7);
  359. var roundingModes_1 = __webpack_require__(2);
  360. var bigDecimal = /** @class */ (function () {
  361. function bigDecimal(number) {
  362. if (number === void 0) { number = '0'; }
  363. this.value = bigDecimal.validate(number);
  364. }
  365. bigDecimal.validate = function (number) {
  366. if (number) {
  367. number = number.toString();
  368. if (isNaN(number))
  369. throw Error("Parameter is not a number: " + number);
  370. if (number[0] == '+')
  371. number = number.substring(1);
  372. }
  373. else
  374. number = '0';
  375. //handle exponentiation
  376. if (/e/i.test(number)) {
  377. var _a = number.split(/[eE]/), mantisa = _a[0], exponent = _a[1];
  378. mantisa = add_1.trim(mantisa);
  379. exponent = parseInt(exponent) + mantisa.indexOf('.');
  380. mantisa = mantisa.replace('.', '');
  381. if (mantisa.length < exponent) {
  382. number = mantisa + (new Array(exponent - mantisa.length + 1)).join('0');
  383. }
  384. else if (mantisa.length >= exponent && exponent > 0) {
  385. number = add_1.trim(mantisa.substring(0, exponent)) +
  386. ((mantisa.length > exponent) ? ('.' + mantisa.substring(exponent)) : '');
  387. }
  388. else {
  389. number = '0.' + (new Array(-exponent + 1)).join('0') + mantisa;
  390. }
  391. }
  392. return number;
  393. };
  394. bigDecimal.prototype.getValue = function () {
  395. return this.value;
  396. };
  397. bigDecimal.getPrettyValue = function (number, digits, separator) {
  398. if (!(digits || separator)) {
  399. digits = 3;
  400. separator = ',';
  401. }
  402. else if (!(digits && separator)) {
  403. throw Error('Illegal Arguments. Should pass both digits and separator or pass none');
  404. }
  405. number = bigDecimal.validate(number);
  406. var neg = number.charAt(0) == '-';
  407. if (neg)
  408. number = number.substring(1);
  409. var len = number.indexOf('.');
  410. len = len > 0 ? len : (number.length);
  411. var temp = '';
  412. for (var i = len; i > 0;) {
  413. if (i < digits) {
  414. digits = i;
  415. i = 0;
  416. }
  417. else
  418. i -= digits;
  419. temp = number.substring(i, i + digits) + ((i < (len - digits) && i >= 0) ? separator : '') + temp;
  420. }
  421. return (neg ? '-' : '') + temp + number.substring(len);
  422. };
  423. bigDecimal.prototype.getPrettyValue = function (digits, separator) {
  424. return bigDecimal.getPrettyValue(this.value, digits, separator);
  425. };
  426. bigDecimal.round = function (number, precision, mode) {
  427. if (precision === void 0) { precision = 0; }
  428. if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; }
  429. number = bigDecimal.validate(number);
  430. if (isNaN(precision))
  431. throw Error("Precision is not a number: " + precision);
  432. return round_1.roundOff(number, precision, mode);
  433. };
  434. bigDecimal.prototype.round = function (precision, mode) {
  435. if (precision === void 0) { precision = 0; }
  436. if (mode === void 0) { mode = roundingModes_1.RoundingModes.HALF_EVEN; }
  437. if (isNaN(precision))
  438. throw Error("Precision is not a number: " + precision);
  439. return new bigDecimal(round_1.roundOff(this.value, precision, mode));
  440. };
  441. bigDecimal.floor = function (number) {
  442. number = bigDecimal.validate(number);
  443. if (number.indexOf('.') === -1)
  444. return number;
  445. return bigDecimal.round(bigDecimal.subtract(number, 0.5));
  446. };
  447. bigDecimal.prototype.floor = function () {
  448. if (this.value.indexOf('.') === -1)
  449. return new bigDecimal(this.value);
  450. return this.subtract(new bigDecimal(0.5)).round();
  451. };
  452. bigDecimal.ceil = function (number) {
  453. number = bigDecimal.validate(number);
  454. if (number.indexOf('.') === -1)
  455. return number;
  456. return bigDecimal.round(bigDecimal.add(number, 0.5));
  457. };
  458. bigDecimal.prototype.ceil = function () {
  459. if (this.value.indexOf('.') === -1)
  460. return new bigDecimal(this.value);
  461. return this.add(new bigDecimal(0.5)).round();
  462. };
  463. bigDecimal.add = function (number1, number2) {
  464. number1 = bigDecimal.validate(number1);
  465. number2 = bigDecimal.validate(number2);
  466. return add_1.add(number1, number2);
  467. };
  468. bigDecimal.prototype.add = function (number) {
  469. return new bigDecimal(add_1.add(this.value, number.getValue()));
  470. };
  471. bigDecimal.subtract = function (number1, number2) {
  472. number1 = bigDecimal.validate(number1);
  473. number2 = bigDecimal.validate(number2);
  474. return subtract_1.subtract(number1, number2);
  475. };
  476. bigDecimal.prototype.subtract = function (number) {
  477. return new bigDecimal(subtract_1.subtract(this.value, number.getValue()));
  478. };
  479. bigDecimal.multiply = function (number1, number2) {
  480. number1 = bigDecimal.validate(number1);
  481. number2 = bigDecimal.validate(number2);
  482. return multiply_1.multiply(number1, number2);
  483. };
  484. bigDecimal.prototype.multiply = function (number) {
  485. return new bigDecimal(multiply_1.multiply(this.value, number.getValue()));
  486. };
  487. bigDecimal.divide = function (number1, number2, precision) {
  488. number1 = bigDecimal.validate(number1);
  489. number2 = bigDecimal.validate(number2);
  490. return divide_1.divide(number1, number2, precision);
  491. };
  492. bigDecimal.prototype.divide = function (number, precision) {
  493. return new bigDecimal(divide_1.divide(this.value, number.getValue(), precision));
  494. };
  495. bigDecimal.compareTo = function (number1, number2) {
  496. number1 = bigDecimal.validate(number1);
  497. number2 = bigDecimal.validate(number2);
  498. return compareTo_1.compareTo(number1, number2);
  499. };
  500. bigDecimal.prototype.compareTo = function (number) {
  501. return compareTo_1.compareTo(this.value, number.getValue());
  502. };
  503. bigDecimal.negate = function (number) {
  504. number = bigDecimal.validate(number);
  505. return subtract_1.negate(number);
  506. };
  507. bigDecimal.prototype.negate = function () {
  508. return new bigDecimal(subtract_1.negate(this.value));
  509. };
  510. bigDecimal.RoundingModes = roundingModes_1.RoundingModes;
  511. return bigDecimal;
  512. }());
  513. module.exports = bigDecimal;
  514. /***/ }),
  515. /* 4 */
  516. /***/ (function(module, exports, __webpack_require__) {
  517. "use strict";
  518. Object.defineProperty(exports, "__esModule", { value: true });
  519. function multiply(number1, number2) {
  520. number1 = number1.toString();
  521. number2 = number2.toString();
  522. /*Filter numbers*/
  523. var negative = 0;
  524. if (number1[0] == '-') {
  525. negative++;
  526. number1 = number1.substr(1);
  527. }
  528. if (number2[0] == '-') {
  529. negative++;
  530. number2 = number2.substr(1);
  531. }
  532. number1 = trailZero(number1);
  533. number2 = trailZero(number2);
  534. var decimalLength1 = 0;
  535. var decimalLength2 = 0;
  536. if (number1.indexOf('.') != -1) {
  537. decimalLength1 = number1.length - number1.indexOf('.') - 1;
  538. }
  539. if (number2.indexOf('.') != -1) {
  540. decimalLength2 = number2.length - number2.indexOf('.') - 1;
  541. }
  542. var decimalLength = decimalLength1 + decimalLength2;
  543. number1 = trailZero(number1.replace('.', ''));
  544. number2 = trailZero(number2.replace('.', ''));
  545. if (number1.length < number2.length) {
  546. var temp = number1;
  547. number1 = number2;
  548. number2 = temp;
  549. }
  550. if (number2 == '0') {
  551. return '0';
  552. }
  553. /*
  554. * Core multiplication
  555. */
  556. var length = number2.length;
  557. var carry = 0;
  558. var positionVector = [];
  559. var currentPosition = length - 1;
  560. var result = "";
  561. for (var i = 0; i < length; i++) {
  562. positionVector[i] = number1.length - 1;
  563. }
  564. for (var i = 0; i < 2 * number1.length; i++) {
  565. var sum = 0;
  566. for (var j = number2.length - 1; j >= currentPosition && j >= 0; j--) {
  567. if (positionVector[j] > -1 && positionVector[j] < number1.length) {
  568. sum += parseInt(number1[positionVector[j]--]) * parseInt(number2[j]);
  569. }
  570. }
  571. sum += carry;
  572. carry = Math.floor(sum / 10);
  573. result = sum % 10 + result;
  574. currentPosition--;
  575. }
  576. /*
  577. * Formatting result
  578. */
  579. result = trailZero(adjustDecimal(result, decimalLength));
  580. if (negative == 1) {
  581. result = '-' + result;
  582. }
  583. return result;
  584. }
  585. exports.multiply = multiply;
  586. /*
  587. * Add decimal point
  588. */
  589. function adjustDecimal(number, decimal) {
  590. if (decimal == 0)
  591. return number;
  592. else {
  593. number = (decimal >= number.length) ? ((new Array(decimal - number.length + 1)).join('0') + number) : number;
  594. return number.substr(0, number.length - decimal) + '.' + number.substr(number.length - decimal, decimal);
  595. }
  596. }
  597. /*
  598. * Removes zero from front and back*/
  599. function trailZero(number) {
  600. while (number[0] == '0') {
  601. number = number.substr(1);
  602. }
  603. if (number.indexOf('.') != -1) {
  604. while (number[number.length - 1] == '0') {
  605. number = number.substr(0, number.length - 1);
  606. }
  607. }
  608. if (number == "" || number == ".") {
  609. number = '0';
  610. }
  611. else if (number[number.length - 1] == '.') {
  612. number = number.substr(0, number.length - 1);
  613. }
  614. if (number[0] == '.') {
  615. number = '0' + number;
  616. }
  617. return number;
  618. }
  619. /***/ }),
  620. /* 5 */
  621. /***/ (function(module, exports, __webpack_require__) {
  622. "use strict";
  623. Object.defineProperty(exports, "__esModule", { value: true });
  624. var add_1 = __webpack_require__(0);
  625. var round_1 = __webpack_require__(1);
  626. function divide(dividend, divisor, precission) {
  627. if (precission === void 0) { precission = 8; }
  628. if (divisor == 0) {
  629. throw new Error('Cannot divide by 0');
  630. }
  631. dividend = dividend.toString();
  632. divisor = divisor.toString();
  633. // remove trailing zeros in decimal ISSUE#18
  634. dividend = dividend.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, "");
  635. divisor = divisor.replace(/(\.\d*?[1-9])0+$/g, "$1").replace(/\.0+$/, "");
  636. if (dividend == 0)
  637. return '0';
  638. var neg = 0;
  639. if (divisor[0] == '-') {
  640. divisor = divisor.substring(1);
  641. neg++;
  642. }
  643. if (dividend[0] == '-') {
  644. dividend = dividend.substring(1);
  645. neg++;
  646. }
  647. var pt_dvsr = divisor.indexOf('.') > 0 ? divisor.length - divisor.indexOf('.') - 1 : -1;
  648. divisor = add_1.trim(divisor.replace('.', ''));
  649. if (pt_dvsr >= 0) {
  650. var pt_dvnd = dividend.indexOf('.') > 0 ? dividend.length - dividend.indexOf('.') - 1 : -1;
  651. if (pt_dvnd == -1) {
  652. dividend = add_1.trim(dividend + (new Array(pt_dvsr + 1)).join('0'));
  653. }
  654. else {
  655. if (pt_dvsr > pt_dvnd) {
  656. dividend = dividend.replace('.', '');
  657. dividend = add_1.trim(dividend + (new Array(pt_dvsr - pt_dvnd + 1)).join('0'));
  658. }
  659. else if (pt_dvsr < pt_dvnd) {
  660. dividend = dividend.replace('.', '');
  661. var loc = dividend.length - pt_dvnd + pt_dvsr;
  662. dividend = add_1.trim(dividend.substring(0, loc) + '.' + dividend.substring(loc));
  663. }
  664. else if (pt_dvsr == pt_dvnd) {
  665. dividend = add_1.trim(dividend.replace('.', ''));
  666. }
  667. }
  668. }
  669. var prec = 0, dl = divisor.length, rem = '0', quotent = '';
  670. var dvnd = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(0, dl + 1) : dividend.substring(0, dl);
  671. dividend = (dividend.indexOf('.') > -1 && dividend.indexOf('.') < dl) ? dividend.substring(dl + 1) : dividend.substring(dl);
  672. if (dvnd.indexOf('.') > -1) {
  673. var shift = dvnd.length - dvnd.indexOf('.') - 1;
  674. dvnd = dvnd.replace('.', '');
  675. if (dl > dvnd.length) {
  676. shift += dl - dvnd.length;
  677. dvnd = dvnd + (new Array(dl - dvnd.length + 1)).join('0');
  678. }
  679. prec = shift;
  680. quotent = '0.' + (new Array(shift)).join('0');
  681. }
  682. precission = precission + 2;
  683. while (prec <= precission) {
  684. var qt = 0;
  685. while (parseInt(dvnd) >= parseInt(divisor)) {
  686. dvnd = add_1.add(dvnd, '-' + divisor);
  687. qt++;
  688. }
  689. quotent += qt;
  690. if (!dividend) {
  691. if (!prec)
  692. quotent += '.';
  693. prec++;
  694. dvnd = dvnd + '0';
  695. }
  696. else {
  697. if (dividend[0] == '.') {
  698. quotent += '.';
  699. prec++;
  700. dividend = dividend.substring(1);
  701. }
  702. dvnd = dvnd + dividend.substring(0, 1);
  703. dividend = dividend.substring(1);
  704. }
  705. }
  706. return ((neg == 1) ? '-' : '') + add_1.trim(round_1.roundOff(quotent, precission - 2));
  707. }
  708. exports.divide = divide;
  709. /***/ }),
  710. /* 6 */
  711. /***/ (function(module, exports, __webpack_require__) {
  712. "use strict";
  713. Object.defineProperty(exports, "__esModule", { value: true });
  714. var add_1 = __webpack_require__(0);
  715. function compareTo(number1, number2) {
  716. var _a;
  717. var negative = false;
  718. if (number1[0] == '-' && number2[0] != "-") {
  719. return -1;
  720. }
  721. else if (number1[0] != '-' && number2[0] == '-') {
  722. return 1;
  723. }
  724. else if (number1[0] == '-' && number2[0] == '-') {
  725. number1 = number1.substr(1);
  726. number2 = number2.substr(1);
  727. negative = true;
  728. }
  729. _a = add_1.pad(number1, number2), number1 = _a[0], number2 = _a[1];
  730. if (number1.localeCompare(number2) == 0) {
  731. return 0;
  732. }
  733. for (var i = 0; i < number1.length; i++) {
  734. if (number1[i] == number2[i]) {
  735. continue;
  736. }
  737. else if (number1[i] > number2[i]) {
  738. if (negative) {
  739. return -1;
  740. }
  741. else {
  742. return 1;
  743. }
  744. }
  745. else {
  746. if (negative) {
  747. return 1;
  748. }
  749. else {
  750. return -1;
  751. }
  752. }
  753. }
  754. return 0;
  755. }
  756. exports.compareTo = compareTo;
  757. /***/ }),
  758. /* 7 */
  759. /***/ (function(module, exports, __webpack_require__) {
  760. "use strict";
  761. Object.defineProperty(exports, "__esModule", { value: true });
  762. var add_1 = __webpack_require__(0);
  763. function subtract(number1, number2) {
  764. number1 = number1.toString();
  765. number2 = number2.toString();
  766. number2 = negate(number2);
  767. return add_1.add(number1, number2);
  768. }
  769. exports.subtract = subtract;
  770. function negate(number) {
  771. if (number[0] == '-') {
  772. number = number.substr(1);
  773. }
  774. else {
  775. number = '-' + number;
  776. }
  777. return number;
  778. }
  779. exports.negate = negate;
  780. /***/ })
  781. /******/ ]);