/** * Created by jimiz on 2017/3/28. */ let scMathUtil = { innerRoundTo: function(num, digit){ let lFactor = Math.pow(10, digit); let fOffSet = 0.5; let sign = ''; if (num < 0){ sign = '-'; num = Math.abs(num); } let result = Math.floor((num / lFactor) + fOffSet).toString(); let iLength = result.length; let r1 = result.substring(0, iLength + digit); let r2 = result.substring(iLength + digit, iLength); return Number(sign + r1 + '.' + r2); }, floatToBin: function(num) { return num.toString(2); }, binToFloat: function(bin) { let result = 0; let iLength = bin.length; let sign = ''; if (iLength > 0 && bin[0]==='-'){ sign = '-'; bin = bin.substring(1, iLength); } iLength = bin.length; let iDot = bin.indexOf('.'); if (iDot >= 0) { for (let i = 0; i < iLength; i++) { let num = Number(bin[i]); let idx = iDot - i; if (idx === 0) { continue }; if (idx > 0) { idx -= 1 }; let r = Math.pow(2, idx); result += num * r; } } else { result = parseInt(bin, 2); }; return sign + result; }, zeroString: function(length){ let result = ''; for (let i = 0; i < length; i++){ result = result + '0'; }; return result; }, incMantissa: function(bin){ let result = bin; let iDot = bin.indexOf('.'); if (iDot < 0){return result}; // 二进制浮点数带小数位数最大长度 let floatLength = 53; let iLength = bin.length; // 长度小于53说明该二进制数尾数长度小于Double类型限制,未被截断,无需进位 if (iLength < floatLength) { return result; } let iLength = bin.length; for (let i = iLength - 1; i > iDot; i--){ let num = Number(bin[i]); if (num === 0){ num = 1; let bin1 = bin.substring(0, i); let bin2 = this.zeroString(iLength - (i + 1));//bin.substring(i + 1, iLength); result = bin1 + num.toString() + bin2; break; } }; return result; }, roundTo: function(num, digit){ let me = this; return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit); } }; Number.prototype.toDecimal = function (ADigit) { //return parseFloat(this.toFixed(ADigit)); digit = (ADigit && typeof(ADigit) === 'number' && Number.isInteger(ADigit) && ADigit >= 0) ? -ADigit : -2; // var s = scMathUtil.roundTo(this, digit); // console.log('Number: ' + this + ' Digit: ' + digit + ' Result: ' + s); // return parseFloat(s); return scMathUtil.roundTo(this, digit); };