scMathUtil.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // 二进制浮点数带小数位数最大长度
  63. let floatLength = 53;
  64. let iLength = bin.length;
  65. // 长度小于53说明该二进制数尾数长度小于Double类型限制,未被截断,无需进位
  66. if (iLength < floatLength) {
  67. return result;
  68. }
  69. let iLength = bin.length;
  70. for (let i = iLength - 1; i > iDot; i--){
  71. let num = Number(bin[i]);
  72. if (num === 0){
  73. num = 1;
  74. let bin1 = bin.substring(0, i);
  75. let bin2 = this.zeroString(iLength - (i + 1));//bin.substring(i + 1, iLength);
  76. result = bin1 + num.toString() + bin2;
  77. break;
  78. }
  79. };
  80. return result;
  81. },
  82. roundTo: function(num, digit){
  83. let me = this;
  84. return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
  85. }
  86. };
  87. Number.prototype.toDecimal = function (ADigit) {
  88. //return parseFloat(this.toFixed(ADigit));
  89. digit = (ADigit && typeof(ADigit) === 'number' && Number.isInteger(ADigit) && ADigit >= 0) ? -ADigit : -2;
  90. // var s = scMathUtil.roundTo(this, digit);
  91. // console.log('Number: ' + this + ' Digit: ' + digit + ' Result: ' + s);
  92. // return parseFloat(s);
  93. return scMathUtil.roundTo(this, digit);
  94. };