scMathUtil.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Created by jimiz on 2017/3/28.
  3. */
  4. let scMathUtil = {
  5. innerRoundTo: function(num, digit){
  6. let lFactor = Math.pow(10, digit);
  7. let fOffSet = 0.5;
  8. let sign = '';
  9. if (num < 0){
  10. sign = '-';
  11. num = Math.abs(num);
  12. }
  13. let result = Math.floor((num / lFactor) + fOffSet).toString();
  14. let iLength = result.length;
  15. let r1 = result.substring(0, iLength + digit);
  16. let r2 = result.substring(iLength + digit, iLength);
  17. return Number(sign + r1 + '.' + r2);
  18. },
  19. floatToBin: function(num) {
  20. return num.toString(2);
  21. },
  22. binToFloat: function(bin) {
  23. let result = 0;
  24. let iLength = bin.length;
  25. let sign = '';
  26. if (iLength > 0 && bin[0]==='-'){
  27. sign = '-';
  28. bin = bin.substring(1, iLength);
  29. }
  30. iLength = bin.length;
  31. let iDot = bin.indexOf('.');
  32. if (iDot >= 0) {
  33. for (let i = 0; i < iLength; i++) {
  34. let num = Number(bin[i]);
  35. let idx = iDot - i;
  36. if (idx === 0) {
  37. continue
  38. };
  39. if (idx > 0) {
  40. idx -= 1
  41. };
  42. let r = Math.pow(2, idx);
  43. result += num * r;
  44. }
  45. }
  46. else {
  47. result = parseInt(bin, 2);
  48. };
  49. return sign + result;
  50. },
  51. zeroString: function(length){
  52. let result = '';
  53. for (let i = 0; i < length; i++){
  54. result = result + '0';
  55. };
  56. return result;
  57. },
  58. incMantissa: function(bin){
  59. let result = bin;
  60. let iDot = bin.indexOf('.');
  61. if (iDot < 0){return result};
  62. let iLength = bin.length;
  63. for (let i = iLength - 1; i > iDot; i--){
  64. let num = Number(bin[i]);
  65. if (num === 0){
  66. num = 1;
  67. let bin1 = bin.substring(0, i);
  68. let bin2 = zeroString(iLength - (i + 1));//bin.substring(i + 1, iLength);
  69. result = bin1 + num.toString() + bin2;
  70. break;
  71. }
  72. };
  73. return result;
  74. },
  75. roundTo: function(num, digit){
  76. let me = this;
  77. return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
  78. }
  79. };