acc.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * 数学运算
  3. */
  4. /**
  5. * 两个浮点数求和
  6. * @author lsy
  7. * @param num1
  8. * @param num2
  9. * @return {number}
  10. */
  11. export function accAdd(num1, num2) {
  12. // eslint-disable-next-line one-var
  13. let r1 = 0, r2 = 0
  14. try {
  15. r1 = (num1.toString().split('.')[1] || []).length
  16. } catch (e) {
  17. return num1 + num2
  18. }
  19. try {
  20. r2 = (num2.toString().split('.')[1] || []).length
  21. } catch (e) {
  22. return num1 + num2
  23. }
  24. const m = Math.pow(10, Math.max(r1, r2))
  25. return Math.round(accMul(num1, m) + accMul(num2, m)) / m
  26. }
  27. /**
  28. * 两个浮点数相减
  29. * @author lsy
  30. * @param num1
  31. * @param num2
  32. * @return {number}
  33. */
  34. export function accSub(num1, num2) {
  35. let r1, r2
  36. try {
  37. r1 = (num1.toString().split('.')[1] || []).length
  38. } catch (e) {
  39. return num1 - num2
  40. }
  41. try {
  42. r2 = (num2.toString().split('.')[1] || []).length
  43. } catch (e) {
  44. return num1 - num2
  45. }
  46. const m = Math.pow(10, Math.max(r1, r2))
  47. return Math.round(accMul(num1, m) - accMul(num2, m)) / m
  48. }
  49. /**
  50. * 两个浮点数相乘
  51. * @author lsy
  52. * @param num1
  53. * @param num2
  54. * @return {number}
  55. */
  56. export function accMul(num1, num2) {
  57. let m = 0
  58. const s1 = num1.toString()
  59. const s2 = num2.toString()
  60. try {
  61. m += (s1.split('.')[1] || []).length
  62. } catch (e) {
  63. return num1 * num2
  64. }
  65. try {
  66. m += (s2.split('.')[1] || []).length
  67. } catch (e) {
  68. return num1 * num2
  69. }
  70. return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
  71. }
  72. /**
  73. * 两个浮点数相除
  74. * @author lsy
  75. * @param num1
  76. * @param num2
  77. * @return {number}
  78. */
  79. export function accDiv(num1, num2) {
  80. let m = 0
  81. const s1 = num1.toString()
  82. const s2 = num2.toString()
  83. try {
  84. m += (s1.split('.')[1] || []).length
  85. } catch (e) {
  86. return num1 / num2
  87. }
  88. try {
  89. m += (s2.split('.')[1] || []).length
  90. } catch (e) {
  91. return num1 / num2
  92. }
  93. const n1 = accMul(num1, Math.pow(10, m))
  94. const n2 = accMul(num2, Math.pow(10, m))
  95. return Number(n1) / Number(n2)
  96. }