index.jsx 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. let toNonExponential = (num) => {
  2. var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
  3. return num.toFixed(Math.max(0, (m[1] || "").length - m[2]));
  4. };
  5. /**
  6. * 乘法 - js运算精度丢失问题
  7. * @param arg1 数1
  8. * @param arg2 数2
  9. * 0.0023 * 100 ==> 0.22999999999999998
  10. * {{ 0.0023 | multiply(100) }} ==> 0.23
  11. */
  12. export const floatMultiply = (arg1, arg2) => {
  13. console.log("==222==");
  14. arg1 = Number(arg1);
  15. arg2 = Number(arg2);
  16. if ((!arg1 && arg1 !== 0) || (!arg2 && arg2 !== 0)) {
  17. return null;
  18. }
  19. arg1 = toNonExponential(arg1);
  20. arg2 = toNonExponential(arg2);
  21. let n1, n2;
  22. let r1, r2; // 小数位数
  23. try {
  24. r1 = arg1.toString().split(".")[1].length;
  25. } catch (e) {
  26. r1 = 0;
  27. }
  28. try {
  29. r2 = arg2.toString().split(".")[1].length;
  30. } catch (e) {
  31. r2 = 0;
  32. }
  33. n1 = Number(arg1.toString().replace(".", ""));
  34. n2 = Number(arg2.toString().replace(".", ""));
  35. return (n1 * n2) / Math.pow(10, r1 + r2);
  36. };
  37. /**
  38. * 除法 - js运算精度丢失问题
  39. * @param arg1 数1
  40. * @param arg2 数2
  41. * 0.0023 / 0.00001 ==> 229.99999999999997
  42. * {{ 0.0023 | divide(0.00001) }} ==> 230
  43. */
  44. export const floatDivide = (arg1, arg2) => {
  45. arg1 = Number(arg1);
  46. arg2 = Number(arg2);
  47. if (!arg2) {
  48. return null;
  49. }
  50. if (!arg1 && arg1!==0) {
  51. return null;
  52. }else if(arg1===0) {
  53. return 0;
  54. }
  55. arg1 = toNonExponential(arg1);
  56. arg2 = toNonExponential(arg2);
  57. let n1, n2;
  58. let r1, r2; // 小数位数
  59. try {
  60. r1 = arg1.toString().split(".")[1].length;
  61. } catch (e) {
  62. r1 = 0;
  63. }
  64. try {
  65. r2 = arg2.toString().split(".")[1].length;
  66. } catch (e) {
  67. r2 = 0;
  68. }
  69. n1 = Number(arg1.toString().replace(".", ""));
  70. n2 = Number(arg2.toString().replace(".", ""));
  71. return floatMultiply((n1 / n2), Math.pow(10, r2 - r1));
  72. // return (n1 / n2) * Math.pow(10, r2 - r1); // 直接乘法还是会出现精度问题
  73. }