Sciencen_M.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import LogUtil from "./LogUtil";
  2. export default class Sciencen_M {
  3. private count = { 4: "万", 8: "亿", 12: "兆", 16: "万兆", 20: "亿兆", 24: "兆兆", 28: "万兆兆", 32: "亿兆兆", 36: "兆兆兆" }
  4. private static _me: Sciencen_M;
  5. constructor() {
  6. }
  7. public static get instance(): Sciencen_M {
  8. if (this._me == null) {
  9. this._me = new Sciencen_M();
  10. }
  11. return this._me;
  12. }
  13. /**
  14. * 超大数值加法运算 忽略小数部分
  15. **/
  16. addition = (a: string, b: string): string => {
  17. var res: any = '',
  18. temp: any = 0;
  19. let a1 = a.split('.')[0].split('');
  20. let b1 = b.split('.')[0].split('');
  21. while (a1.length || b1.length || temp) {
  22. temp += ~~a1.pop() + ~~b1.pop();
  23. res = (temp % 10) + res;
  24. temp = temp > 9;
  25. }
  26. return res.replace(/^0+/, '');
  27. }
  28. /**
  29. * 超大数值减法运算 忽略小数部分
  30. **/
  31. subtraction = (a: any, b: any): string => {
  32. a = a.split('.')[0].split('');
  33. b = b.split('.')[0].split('');
  34. var aMaxb = a.length > b.length;
  35. if (a.length == b.length) {
  36. for (var i = 0, len = a.length; i < len; i++) {
  37. if (a[i] == b[i]) continue;
  38. aMaxb = a[i] > b[i];
  39. break;
  40. }
  41. }
  42. if (!aMaxb) a = [b, b = a][0];
  43. var result = '';
  44. while (a.length) {
  45. var temp = parseInt(a.pop()) - parseInt(b.pop() || 0);
  46. if (temp >= 0) result = temp + result;
  47. else {
  48. result = temp + 10 + result;
  49. a[a.length - 1]--;
  50. }
  51. }
  52. result = (aMaxb ? '' : '-') + result.replace(/^0*/g, '');
  53. if (result == '-') {
  54. result = '0'
  55. }
  56. return result
  57. }
  58. /**
  59. * 超大数值高位对比 忽略小数部分
  60. */
  61. ContrastNumber = (a: any, b: any): boolean => {
  62. a = a.split('.')[0].split('');
  63. b = b.split('.')[0].split('');
  64. var aMaxb = a.length > b.length;
  65. if (a.length == b.length) {
  66. for (var i = 0, len = a.length; i < len; i++) {
  67. if (a[i] == b[i]) continue;
  68. aMaxb = a[i] > b[i];
  69. break;
  70. }
  71. }
  72. if (!aMaxb) a = [b, b = a][0];
  73. var result = '';
  74. while (a.length) {
  75. var temp = parseInt(a.pop()) - parseInt(b.pop() || 0);
  76. if (temp >= 0) result = temp + result;
  77. else {
  78. result = temp + 10 + result;
  79. a[a.length - 1]--;
  80. }
  81. }
  82. if (a === b) return true;
  83. return Boolean(aMaxb);
  84. }
  85. /**
  86. * 数值乘法
  87. */
  88. private accMuls = (a, b) => {
  89. let arra = a.split('').reverse(),
  90. arrb = b.split('').reverse(),
  91. lena = arra.length,
  92. lenb = arrb.length,
  93. result: any = Array(lena + lenb + 1).join('0').split('');
  94. arra.map((itema, indexa) => {
  95. arrb.map((itemb, indexb) => {
  96. result[indexa + indexb] = +result[indexa + indexb] + itema * itemb;
  97. });
  98. });
  99. result.map((item, index) => {
  100. if (item >= 10) {
  101. result[index + 1] = ~~result[index + 1] + ~~(result[index] / 10);
  102. result[index] %= 10;
  103. }
  104. });
  105. return result.reverse().join('').replace(/^0+/, '');
  106. }
  107. /**
  108. * 超大数值乘法
  109. */
  110. accMul = (arg1: string, arg2: string) => {
  111. var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
  112. try { m += s1.split(".")[1].length } catch (e) { }
  113. try { m += s2.split(".")[1].length } catch (e) { }
  114. let targe = this.accMuls(s1.replace(".", ""), s2.replace(".", ""));
  115. return this.accDiv(targe, Math.pow(10, m).toString())
  116. }
  117. /** 科学技术法转为数值字符串形式 */
  118. toNonExponential = (num: number) => {
  119. let result = ''
  120. let str = num.toString()
  121. if (str.indexOf('e') != -1) {
  122. let m = str.split('e')
  123. let n = m[0].split('.')
  124. let len = parseInt(m[1].slice(1))
  125. let z = ''
  126. if (m[1][0] == '+') {
  127. if (n[1]) {
  128. len = len - n[1].length
  129. for (var i = 0; i < len; i++) {
  130. z += '0'
  131. }
  132. result = n[0] + n[1] + z
  133. }
  134. else {
  135. for (var i = 0; i < len; i++) {
  136. z += '0'
  137. }
  138. result = n[0] + z
  139. }
  140. }
  141. else if (m[1][0] == '-') {
  142. for (var i = 0; i < len - 1; i++) {
  143. z += '0'
  144. }
  145. if (n[1]) {
  146. result = '0.' + z + n[0] + n[1]
  147. }
  148. else {
  149. result = '0.' + z + n[0]
  150. }
  151. }
  152. }
  153. else {
  154. result = str
  155. }
  156. // return num.toLocaleString().replace(/[,]/g, '')
  157. return result
  158. }
  159. /**
  160. * 超大数值除法运算
  161. */
  162. accDiv(arg1: string, arg2: string): string {
  163. var t1 = 0, t2 = 0, t3 = 0, r1, r2;
  164. try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
  165. try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
  166. r1 = Number(arg1.toString().replace(".", ""))
  167. r2 = Number(arg2.toString().replace(".", ""))
  168. if (r2 == 0)
  169. return '0';
  170. var result = String(r1 / r2);
  171. try { t3 = result.toString().split(".")[1].length } catch (e) { }
  172. var index = t2 - t1 - t3;
  173. if (index < 0) {
  174. result = result.replace(".", "");
  175. while (result.length <= Math.abs(index)) {
  176. result = '0' + result;
  177. }
  178. var start = result.substring(0, result.length + index);
  179. var end = result.substring(result.length + index, result.length);
  180. result = start + '.' + end;
  181. return this.toNonExponential(Number(result));
  182. }
  183. else if (index > 0) {
  184. result = result.replace(".", "");
  185. let i = 1;
  186. while (i <= Math.abs(index)) {
  187. result += '0';
  188. i++;
  189. }
  190. return this.toNonExponential(Number(result));
  191. }
  192. else return this.toNonExponential(Number(result.replace(".", "")));
  193. }
  194. /**
  195. * 数值格式化
  196. */
  197. format = (value: string, showDeci: boolean = true) => {
  198. var a = value.split('.')[0];
  199. var b;
  200. for (let i in this.count) {
  201. let ii = Number(i);
  202. if (a.length - 1 >= ii) {
  203. if (showDeci) {
  204. let deci = a.slice(a.length - ii, a.length - ii + 1)
  205. if (Number(deci) >= 1) {
  206. b = a.slice(0, a.length - ii) + "." + deci + this.count[ii];
  207. }
  208. else {
  209. b = a.slice(0, a.length - ii) + this.count[ii];
  210. }
  211. }
  212. else {
  213. b = a.slice(0, a.length - ii) + this.count[ii];
  214. }
  215. }
  216. };
  217. if (!b) return a;
  218. return b;
  219. }
  220. }