bc.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //除法函数,用来得到精确的除法结果
  2. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  3. //调用:div(arg1,arg2)
  4. //返回值:arg1除以arg2的精确结果
  5. export function div(arg1, arg2) {
  6. var t1 = 0,
  7. t2 = 0,
  8. r1,
  9. r2;
  10. try {
  11. t1 = arg1.toString().split(".")[1].length;
  12. } catch (e) {
  13. t1 = 0;
  14. }
  15. try {
  16. t2 = arg2.toString().split(".")[1].length;
  17. } catch (e) {
  18. t2 = 0;
  19. }
  20. r1 = Number(arg1.toString().replace(".", ""));
  21. r2 = Number(arg2.toString().replace(".", ""));
  22. return mul(r1 / r2, Math.pow(10, t2 - t1));
  23. }
  24. //乘法函数,用来得到精确的乘法结果
  25. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  26. //调用:mul(arg1,arg2)
  27. //返回值:arg1乘以arg2的精确结果
  28. export function mul(arg1, arg2) {
  29. var m = 0,
  30. s1 = arg1.toString(),
  31. s2 = arg2.toString();
  32. try {
  33. m += s1.split(".")[1].length;
  34. } catch (e) {
  35. m = 0;
  36. }
  37. try {
  38. m += s2.split(".")[1].length;
  39. } catch (e) {
  40. m = m || 0;
  41. }
  42. return (
  43. (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
  44. Math.pow(10, m)
  45. );
  46. }
  47. //加法函数,用来得到精确的加法结果
  48. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  49. //调用:add(arg1,arg2)
  50. //返回值:arg1加上arg2的精确结果
  51. export function add(arg1, arg2) {
  52. var r1, r2, m, n;
  53. try {
  54. r1 = arg1.toString().split(".")[1].length;
  55. } catch (e) {
  56. r1 = 0;
  57. }
  58. try {
  59. r2 = arg2.toString().split(".")[1].length;
  60. } catch (e) {
  61. r2 = 0;
  62. }
  63. m = Math.pow(10, Math.max(r1, r2));
  64. n = r1 >= r2 ? r1 : r2;
  65. return ((arg1 * m + arg2 * m) / m).toFixed(n);
  66. }
  67. //减法函数,用来得到精确的减法结果
  68. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
  69. //调用:sub(arg1,arg2)
  70. //返回值:arg1减去arg2的精确结果
  71. export function sub(arg1, arg2) {
  72. var r1, r2, m, n;
  73. try {
  74. r1 = arg1.toString().split(".")[1].length;
  75. } catch (e) {
  76. r1 = 0;
  77. }
  78. try {
  79. r2 = arg2.toString().split(".")[1].length;
  80. } catch (e) {
  81. r2 = 0;
  82. }
  83. m = Math.pow(10, Math.max(r1, r2));
  84. //动态控制精度长度
  85. n = r1 >= r2 ? r1 : r2;
  86. return ((arg1 * m - arg2 * m) / m).toFixed(n);
  87. }
  88. function Compute(value) {
  89. this.value = value;
  90. }
  91. Object.assign(Compute.prototype, {
  92. add(v) {
  93. this.value = add(this.value, v);
  94. return this;
  95. },
  96. sub(v) {
  97. this.value = sub(this.value, v);
  98. return this;
  99. },
  100. div(v) {
  101. this.value = div(this.value, v);
  102. return this;
  103. },
  104. mul(v) {
  105. this.value = mul(this.value, v);
  106. return this;
  107. }
  108. });
  109. export default function(value) {
  110. return new Compute(value);
  111. }