12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /**
- * 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;
- }
- 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);
- };
|