lit-decimal
Advanced tools
+23
-21
| //self.BigInt = undefined //模拟IE没有BigInt | ||
| var prec = 16 | ||
| var precPow | ||
| var BIG1 = BigInt(Number.MAX_SAFE_INTEGER) | ||
| var BIG2 = BigInt(Number.MIN_SAFE_INTEGER) | ||
| var BI | ||
| if (typeof BigInt === 'undefined') { | ||
| //IE没有BigInt,不支持大数。只能模拟一个,6位小数 | ||
| self.BigInt = function (num) { | ||
| BI = function (num) { | ||
| if (nInf(num)[1] > 6) num = Number(num.toFixed(6)) | ||
@@ -19,8 +18,12 @@ return { | ||
| } else { | ||
| precPow = BigInt(Math.pow(10, prec)) | ||
| BI = BigInt | ||
| precPow = BI(Math.pow(10, prec)) | ||
| } | ||
| var BIG1 = BI(Number.MAX_SAFE_INTEGER) | ||
| var BIG2 = BI(Number.MIN_SAFE_INTEGER) | ||
| function Decimal(num, pointN) { | ||
| var inf = nInf(num) | ||
| this.v = inf[1] > 0 ? BigInt(Math.round(inf[0] * Math.pow(10, inf[1]))) : BigInt(inf[0]) | ||
| this.v = inf[1] > 0 ? BI(Math.round(inf[0] * Math.pow(10, inf[1]))) : BI(inf[0]) | ||
| this.pt = inf[1] + (pointN || 0) //小数点位置。比如2表示 this.v/100 才为实际值 | ||
@@ -36,3 +39,3 @@ } | ||
| function powN(n) { | ||
| return BigInt(Math.pow(10, n)) | ||
| return BI(Math.pow(10, n)) | ||
| } | ||
@@ -58,4 +61,3 @@ | ||
| var d2 = new Decimal(num) | ||
| var r = d1.v * d2.v | ||
| return new Decimal(r, d1.pt + d2.pt) | ||
| return new Decimal(d1.v * d2.v, d1.pt + d2.pt) | ||
| }, | ||
@@ -65,4 +67,3 @@ divide: function (num) { | ||
| var d2 = new Decimal(num) | ||
| var r = d1.v * precPow / d2.v | ||
| return new Decimal(r, prec + d1.pt - d2.pt) | ||
| return new Decimal(d1.v * precPow / d2.v, prec + d1.pt - d2.pt) | ||
| }, | ||
@@ -75,14 +76,15 @@ //还原为Number | ||
| var s = v.toString() | ||
| if (s.indexOf('object') > -1) s = v.valueOf().toString() //IE | ||
| if (s.indexOf('e')) v = Number(s) //科学计数 | ||
| else { | ||
| var zeros = 0 | ||
| for (var i = s.length - 1; i >= 0; i--) { | ||
| if (s[i] === '0') zeros++ | ||
| else break | ||
| } | ||
| s = s.substring(0, s.length - zeros) | ||
| v = BigInt(s) | ||
| pt -= zeros | ||
| if (s.indexOf('object') > -1) { | ||
| s = v.valueOf().toString() //IE | ||
| if (s.indexOf('e')) | ||
| return Number(s) / Math.pow(10, pt) //科学计数 | ||
| } | ||
| var zeros = 0 | ||
| for (var i = s.length - 1; i >= 0; i--) { | ||
| if (s[i] === '0') zeros++ | ||
| else break | ||
| } | ||
| s = s.substring(0, s.length - zeros) | ||
| v = BI(s) | ||
| pt -= zeros | ||
| } | ||
@@ -89,0 +91,0 @@ return Number(v) / Math.pow(10, pt) |
+1
-1
| { | ||
| "name": "lit-decimal", | ||
| "version": "1.0.1", | ||
| "version": "1.0.2", | ||
| "description": "To fix js number issues, only 1kb. 精简版解决js中由于浮点数精度导致的各种数值不准确的问题。代码极简,压缩后仅1kb左右。", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
+1
-1
@@ -20,2 +20,2 @@ # lit-decimal | ||
| ## 关于IE | ||
| 对于不支持BigInt的浏览器(如IE),也可以基本支持,多数情况下可得到正确结果。超大数值可能不准,如确有需要可引用:https://www.npmjs.com/package/bigint-polyfill。 | ||
| 对于不支持BigInt的浏览器(如IE),也可以基本支持,多数情况下可得到正确结果。超大数值可能不准,如确有需要可引用:https://www.npmjs.com/package/bigint-polyfill 。 |
82
1.23%4226
-0.82%