如何在JavaScript中避免大数量的科学记数法?
当数字变大时,JavaScript将大的INT转换为科学记数法。 我怎样才能防止这种情况发生?
有Number.toFixed ,但是如果数字大于等于1e21并且最大精度为20,则使用科学记数法。除此之外,您可以滚动自己的数字,但这会很麻烦。
function toFixed(x) { if (Math.abs(x) < 1.0) { var e = parseInt(x.toString().split('e-')[1]); if (e) { x *= Math.pow(10,e-1); x = '0.' + (new Array(e)).join('0') + x.toString().substring(2); } } else { var e = parseInt(x.toString().split('+')[1]); if (e > 20) { e -= 20; x /= Math.pow(10,e); x += (new Array(e+1)).join('0'); } } return x; }
上面使用廉价的'n'-easystring重复( (new Array(n+1)).join(str)
)。 你可以使用Russian Peasant Multiplication定义String.prototype.repeat
然后使用它。
或者,您可以使用BigInt库。
多一个可能的解决scheme
function toFix(i){ var str=''; do{ let a = i%10; i=Math.trunc(i/10); str = a+str; }while(i>0) return str; }
对于小数字,你知道你想要多less小数,你可以使用toFixed然后使用正则expression式去除尾随零。
Number(1e-7).toFixed(8).replace(/\.?0+$/,"") //0.000
这是我使用任何数字的Number.prototype.toFixed
方法的简短变体:
Number.prototype.toFixedSpecial = function(n) { var str = this.toFixed(n); if (str.indexOf('e+') < 0) return str; // if number is in scientific notation, pick (b)ase and (p)ower return str.replace('.', '').split('e+').reduce(function(p, b) { return p + Array(b - p.length + 2).join(0); }) + '.' + Array(n + 1).join(0); }; 1e21.toFixedSpecial(2); // "1000000000000000000000.00" 2.1e24.toFixedSpecial(0); // "2100000000000000000000000" 1234567..toFixedSpecial(1); // "1234567.0" 1234567.89.toFixedSpecial(3); // "1234567.890"
使用.toPrecision
, .toFixed
等。您可以通过将其转换为带有.toString
的string,然后查看其.toFixed
,来计算数字中的位数。
这是我最终使用从input的值,扩大数字小于17位,并将指数数字转换为X10 Y
// eg // niceNumber("1.24e+4") becomes // 1.24x10 to the power of 4 [displayed in Superscript] function niceNumber(num) { try{ var sOut = num.toString(); if ( sOut.length >=17 || sOut.indexOf("e") > 0){ sOut=parseFloat(num).toPrecision(5)+""; sOut = sOut.replace("e","x10<sup>")+"</sup>"; } return sOut; } catch ( e) { return num; } }
您可以遍历数字并实现四舍五入
//在给定索引处replacechar的function
String.prototype.replaceAt=function(index, character) { return this.substr(0, index) + character + this.substr(index+character.length); }
//开始循环播放
var str = "123456789123456799.55"; var arr = str.split('.'); str = arr[0]; i = (str.length-1); if(arr[1].length && Math.round(arr[1]/100)){ while(i>0){ var intVal = parseInt(str.charAt(i)); if(intVal == 9){ str = str.replaceAt(i,'0'); console.log(1,str) }else{ str = str.replaceAt(i,(intVal+1).toString()); console.log(2,i,(intVal+1).toString(),str) break; } i--; } }
你可以使用number.toString(10.1)
:
console.log(Number.MAX_VALUE.toString(10.1));
注意:这目前在Chrome浏览器,但不是在Firefox。 规范说基数必须是一个整数,所以这会导致不可靠的行为。
我知道这是多年后,但最近我一直在处理类似的问题,我想发布我的解决scheme。 目前被接受的答案用0填充指数部分,并试图find确切的答案,尽pipe一般来说,由于JS的浮点精度限制,对于非常大的数字不是很准确。
这对Math.pow(2, 100)
2,100 Math.pow(2, 100)
,返回正确的值1267650600228229401496703205376。
function toFixed(x) { var result = ''; var xStr = x.toString(10); var digitCount = xStr.indexOf('e') === -1 ? xStr.length : (parseInt(xStr.substr(xStr.indexOf('e') + 1)) + 1); for (var i = 1; i <= digitCount; i++) { var mod = (x % Math.pow(10, i)).toString(10); var exponent = (mod.indexOf('e') === -1) ? 0 : parseInt(mod.substr(mod.indexOf('e')+1)); if ((exponent === 0 && mod.length !== i) || (exponent > 0 && exponent !== i-1)) { result = '0' + result; } else { result = mod.charAt(0) + result; } } return result; } console.log(toFixed(Math.pow(2,100))); // 1267650600228229401496703205376
你的问题:
number :0x68656c6c6f206f72656f display:4.9299704811152646e+23
你可以使用这个: https : //github.com/MikeMcl/bignumber.js
用于任意精度十进制和非十进制算术的JavaScript库。
喜欢这个 :
let ten =new BigNumber('0x68656c6c6f206f72656f',16); console.log(ten.toString(10)); display:492997048111526447310191
如果你只是做显示,你可以在数字四舍五入之前从数字中build立一个数组。
var num = Math.pow(2, 100); var reconstruct = []; while(num > 0) { reconstruct.unshift(num % 10); num = Math.floor(num / 10); } console.log(reconstruct.join(''));
使用这个function:
function toNonExponential(value) { // if value is not a number try to convert it to number if (typeof value !== "number") { value = parseFloat(value); // after convert, if value is not a number return empty string if (isNaN(value)) { return ""; } } var sign; var e; // if value is negative, save "-" in sign variable and absolute the value if (value < 0) { sign = "-"; value = Math.abs(value); } else { sign = ""; } // if value is between 0 and 1 if (value < 1.0) { // get e value e = parseInt(value.toString().split('e-')[1]); // if value is exponential convert it to non exponential if (e) { value *= Math.pow(10, e - 1); value = '0.' + (new Array(e)).join('0') + value.toString().substring(2); } } else { // get e value e = parseInt(value.toString().split('e+')[1]); // if value is exponential convert it to non exponential if (e) { value /= Math.pow(10, e); value += (new Array(e + 1)).join('0'); } } // if value has negative sign, add to it return sign + value; }
下面的解决scheme绕过自动指数格式非常大和非常小的数字。 这是一个错误修正的outis的解决scheme :它不适用于非常小的负数。
function numberToString(num) { let numStr = String(num); if (Math.abs(num) < 1.0) { let e = parseInt(num.toString().split('e-')[1]); if (e) { let negative = num < 0; if (negative) num *= -1 num *= Math.pow(10, e - 1); numStr = '0.' + (new Array(e)).join('0') + num.toString().substring(2); if (negative) numStr = "-" + numStr; } } else { let e = parseInt(num.toString().split('+')[1]); if (e > 20) { e -= 20; num /= Math.pow(10, e); numStr = num.toString() + (new Array(e + 1)).join('0'); } } return numStr; } // testing ... console.log(numberToString(+0.0000000000000000001)); console.log(numberToString(-0.0000000000000000001)); console.log(numberToString(+314564649798762418795)); console.log(numberToString(-314564649798762418795));
我有与oracle返回科学记数法相同的问题,但我需要一个url的实际数字。 我只是用一个PHP技巧减去零,我得到正确的数字。
例如5.4987E7是val。
newval = val - 0;
newval现在等于54987000