जब संख्या बड़ी हो जाती है तो जावास्क्रिप्ट एक बड़े INT को वैज्ञानिक संकेतन में परिवर्तित करता है । मेरे द्वारा इसे होने से कैसे रोका जा सकता है?
translateपरिवर्तन का सामना करना पड़ता है जिसमें वैज्ञानिक संकेतन में निर्देशांक होते हैं।
जब संख्या बड़ी हो जाती है तो जावास्क्रिप्ट एक बड़े INT को वैज्ञानिक संकेतन में परिवर्तित करता है । मेरे द्वारा इसे होने से कैसे रोका जा सकता है?
translateपरिवर्तन का सामना करना पड़ता है जिसमें वैज्ञानिक संकेतन में निर्देशांक होते हैं।
जवाबों:
नहीं है 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'- आसान स्ट्रिंग पुनरावृत्ति ( (new Array(n+1)).join(str)) का उपयोग करता है । आप परिभाषित कर सकते हैंString.prototype.repeat रूसी किसान गुणन का उपयोग करके कर और इसके बजाय इसका उपयोग कर सकते हैं।
यह उत्तर केवल प्रश्न के संदर्भ में लागू किया जाना चाहिए: वैज्ञानिक अंकन का उपयोग किए बिना बड़ी संख्या में प्रदर्शित करना। कुछ और के लिए, आप एक का उपयोग करना चाहिए BigInt जैसे पुस्तकालय, BigNumber , Leemon के BigInt , या BigInteger । आगे बढ़ते हुए, नया देशी बिगइंट (नोट: लेमन का नहीं) उपलब्ध होना चाहिए; क्रोमियम और इसके आधार पर ब्राउज़र ( क्रोम , नया एज [v79 +], बहादुर ) और फ़ायरफ़ॉक्स सभी का समर्थन है; सफारी का सहारा चल रहा है।
यहां बताया गया है कि आप इसके लिए BigInt का उपयोग कैसे करेंगे: BigInt(n).toString()
उदाहरण:
हालांकि, सावधान रहें कि आप किसी भी पूर्णांक को जावास्क्रिप्ट संख्या ( Number.MAX_SAFE_INTEGER + 1बिगआईंट नहीं) के रूप में आउटपुट करते हैं, जो 15-16 अंकों से अधिक है (विशेष रूप से, [9,007,199,254,740,992 से अधिक ]) को गोल किया जा सकता है, क्योंकि जावास्क्रिप्ट का नंबर प्रकार (IEEE-754 डबल-परिशुद्धता) फ्लोटिंग पॉइंट) उस बिंदु से परे सभी पूर्णांकों को ठीक से पकड़ नहीं सकता है। जैसा कि Number.MAX_SAFE_INTEGER + 1यह 2 के गुणकों में काम कर रहा है, इसलिए यह अब और विषम संख्या नहीं पकड़ सकता है (और अनजाने में, 18,014,398,509,481,984 पर यह 4 के गुणकों में काम करना शुरू कर देता है, फिर 8, फिर 16, ...)।
नतीजतन, यदि आप BigIntसमर्थन पर भरोसा कर सकते हैं, तो अपने नंबर को एक स्ट्रिंग के रूप में आउटपुट करें जो आप BigIntफ़ंक्शन को पास करते हैं:
const n = BigInt("YourNumberHere");
उदाहरण:
Math.abs। सर उठाने के लिए धन्यवाद।
toFixed(Number.MAX_VALUE) == Number.MAX_VALUEफिर वापस लौटना चाहिए, लेकिन यह नहीं है ...
मुझे पता है कि यह एक पुराना सवाल है, लेकिन हाल ही में सक्रिय दिखा। MDN toLocaleString
const myNumb = 1000000000000000000000;
console.log( myNumb ); // 1e+21
console.log( myNumb.toLocaleString() ); // "1,000,000,000,000,000,000,000"
console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) ); // "1000000000000000000000"
आप आउटपुट स्वरूपित करने के लिए विकल्पों का उपयोग कर सकते हैं।
Number.toLocaleString () 16 दशमलव स्थानों के बाद गोल, ताकि ...
const myNumb = 586084736227728377283728272309128120398;
console.log( myNumb.toLocaleString('fullwide', { useGrouping: false }) );
... रिटर्न ...
586084736227728400000000000000000000000
यह शायद अवांछनीय है यदि सटीकता वांछित परिणाम में महत्वपूर्ण है।
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
छोटी संख्या के लिए, और आप जानते हैं कि आप कितने डेसीमल चाहते हैं, तो आप उपयोग कर सकते हैं और फिर ट्रेलिंग शून्य को हटाने के लिए एक regexp का उपयोग कर सकते हैं।
Number(1e-7).toFixed(8).replace(/\.?0+$/,"") //0.000
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
एक और संभव समाधान:
function toFix(i){
var str='';
do{
let a = i%10;
i=Math.trunc(i/10);
str = a+str;
}while(i>0)
return str;
}
Number.MAX_SAFE_INTEGERइस समस्या से पीड़ित होने की संभावना से अधिक संख्या ।
यहाँ मेरा छोटा Number.prototype.toFixedतरीका है जो किसी भी संख्या के साथ काम करता है:
Number.prototype.toFixedSpecial = function(n) {
var str = this.toFixed(n);
if (str.indexOf('e+') === -1)
return str;
// if number is in scientific notation, pick (b)ase and (p)ower
str = str.replace('.', '').split('e+').reduce(function(p, b) {
return p + Array(b - p.length + 2).join(0);
});
if (n > 0)
str += '.' + Array(n + 1).join(0);
return str;
};
console.log( 1e21.toFixedSpecial(2) ); // "1000000000000000000000.00"
console.log( 2.1e24.toFixedSpecial(0) ); // "2100000000000000000000000"
console.log( 1234567..toFixedSpecial(1) ); // "1234567.0"
console.log( 1234567.89.toFixedSpecial(3) ); // "1234567.890"
Number। यदि आप पहले एक को कास्ट करते हैं Number, तो आप देखेंगे कि वे बिल्कुल बराबर हैं: jsfiddle.net/qd6hpnyx/1 । आप अपने :P
.0खाली स्ट्रिंग के साथ किसी भी अनुगामी को बदलने के लिए बेहतर है ।
console.log(2.2e307.toFixedSpecial(10))। मेरा मतलब है ... मुझे कई ट्रेलिंग शून्य मिलते हैं। वैसे भी Upvoting क्योंकि यह मैं क्या जरूरत के करीब लगता है।
निम्न समाधान बहुत बड़ी और बहुत छोटी संख्याओं के लिए स्वचालित घातांक स्वरूपण को दरकिनार कर देता है। यह बगसिक्स के साथ आउटिस का समाधान है : यह बहुत कम नकारात्मक संख्याओं के लिए काम नहीं कर रहा था।
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));
दूसरों के जवाब आपको सटीक संख्या नहीं देते हैं!
यह फ़ंक्शन वांछित संख्या की सही गणना करता है और इसे जावास्क्रिप्ट द्वारा परिवर्तित होने से रोकने के लिए इसे स्ट्रिंग में लौटाता है!
यदि आपको एक संख्यात्मक परिणाम की आवश्यकता है, तो केवल संख्या एक में फ़ंक्शन का परिणाम गुणा करें!
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 calculate the absolute 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;
}
उपयोग .toPrecision, .toFixedआदि। आप अपनी संख्या में अंकों की संख्या को एक स्ट्रिंग में परिवर्तित करके और .toStringफिर उसकी ओर देखकर गिन सकते हैं .length।
(2e64).toString()वापस आ जाएगा "2e+64", इसलिए .lengthबेकार है।
यह है कि मैं क्या, एक इनपुट से मूल्य लेने के लिए का उपयोग कर x10 के विस्तार संख्या 17digits से भी कम समय और परिवर्तित घातीय संख्या समाप्त हो गया है y
// e.g.
// 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;
}
}
आप संख्या पर लूप कर सकते हैं और गोलाई प्राप्त कर सकते हैं
// कार्यक्षमता को दिए गए सूचकांक में चार को बदलने के लिए
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--;
}
}
मैंने संख्या के बजाय स्ट्रिंग रूप के साथ काम करने की कोशिश की और यह काम करने लगा। मैंने इसे केवल Chrome पर परीक्षण किया है लेकिन यह सार्वभौमिक होना चाहिए:
function removeExponent(s) {
var ie = s.indexOf('e');
if (ie != -1) {
if (s.charAt(ie + 1) == '-') {
// negative exponent, prepend with .0s
var n = s.substr(ie + 2).match(/[0-9]+/);
s = s.substr(2, ie - 2); // remove the leading '0.' and exponent chars
for (var i = 0; i < n; i++) {
s = '0' + s;
}
s = '.' + s;
} else {
// positive exponent, postpend with 0s
var n = s.substr(ie + 1).match(/[0-9]+/);
s = s.substr(0, ie); // strip off exponent chars
for (var i = 0; i < n; i++) {
s += '0';
}
}
}
return s;
}
मुझे लगता है कि इस तरह के कई उत्तर हो सकते हैं, लेकिन यहां एक बात सामने आई है
// If you're gonna tell me not to use 'with' I understand, just,
// it has no other purpose, ;( andthe code actually looks neater
// 'with' it but I will edit the answer if anyone insists
var commas = false;
function digit(number1, index1, base1) {
with (Math) {
return floor(number1/pow(base1, index1))%base1;
}
}
function digits(number1, base1) {
with (Math) {
o = "";
l = floor(log10(number1)/log10(base1));
for (var index1 = 0; index1 < l+1; index1++) {
o = digit(number1, index1, base1) + o;
if (commas && i%3==2 && i<l) {
o = "," + o;
}
}
return o;
}
}
// Test - this is the limit of accurate digits I think
console.log(1234567890123450);
नोट: यह केवल जावास्क्रिप्ट गणित कार्यों के समान सटीक है और लूप के लिए लाइन पर लॉग 10 के बजाय लॉग का उपयोग करते समय समस्याएँ हैं; यह बेस -10 में 1000 को 000 के रूप में लिखेगा इसलिए मैंने इसे log10 में बदल दिया क्योंकि लोग ज्यादातर बेस -10 का उपयोग कर रहे होंगे।
यह एक बहुत सटीक समाधान नहीं हो सकता है, लेकिन मुझे यह कहते हुए गर्व है कि यह सफलतापूर्वक आधारों पर संख्याओं का अनुवाद कर सकता है और अल्पविराम के लिए एक विकल्प के साथ आता है!
आपका प्रश्न:
number :0x68656c6c6f206f72656f
display:4.9299704811152646e+23
आप इसका उपयोग कर सकते हैं: https://github.com/MikeMcl/bignumber.js
मनमाने ढंग से सटीक दशमलव और गैर-दशमलव अंकगणित के लिए एक जावास्क्रिप्ट पुस्तकालय।
इस तरह:
let ten =new BigNumber('0x68656c6c6f206f72656f',16);
console.log(ten.toString(10));
display:492997048111526447310191
मुझे पता है कि यह कई साल बाद है, लेकिन मैं हाल ही में इसी तरह के मुद्दे पर काम कर रहा था और मैं अपना समाधान पोस्ट करना चाहता था। वर्तमान में स्वीकृत उत्तर को 0 के साथ घातांक वाले हिस्से से बाहर निकालता है, और मेरा सटीक उत्तर खोजने का प्रयास करता है, हालांकि सामान्य तौर पर फ्लोटिंग पॉइंट परिशुद्धता में जेएस की सीमा के कारण यह बहुत बड़ी संख्या के लिए बिल्कुल सटीक नहीं है।
यह 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
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
function printInt(n) { return n.toPrecision(100).replace(/\..*/,""); }
कुछ मुद्दों के साथ:
नियमित भावों को तोड़ना। इसका कोई सटीक मुद्दा नहीं है और यह बहुत अधिक कोड नहीं है।
function toPlainString(num) {
return (''+num).replace(/(-?)(\d*)\.?(\d+)e([+-]\d+)/,
function(a,b,c,d,e) {
return e < 0
? b + '0.' + Array(1-e-c.length).join(0) + c + d
: b + c + d + Array(e-d.length+1).join(0);
});
}
console.log(toPlainString(12345e+12));
console.log(toPlainString(12345e+24));
console.log(toPlainString(-12345e+24));
console.log(toPlainString(12345e-12));
console.log(toPlainString(123e-12));
console.log(toPlainString(-123e-12));
console.log(toPlainString(-123.45e-56));
यदि आप इसे केवल प्रदर्शन के लिए कर रहे हैं, तो आप गोल होने से पहले अंकों से एक सरणी बना सकते हैं।
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 dissolveExponentialNotation(number)
{
if(!Number.isFinite(number)) { return undefined; }
let text = number.toString();
let items = text.split('e');
if(items.length == 1) { return text; }
let significandText = items[0];
let exponent = parseInt(items[1]);
let characters = Array.from(significandText);
let minus = characters[0] == '-';
if(minus) { characters.splice(0, 1); }
let indexDot = characters.reduce((accumulator, character, index) =>
{
if(!accumulator.found) { if(character == '.') { accumulator.found = true; } else { accumulator.index++; } }
return accumulator;
}, { index: 0, found: false }).index;
characters.splice(indexDot, 1);
indexDot += exponent;
if(indexDot >= 0 && indexDot < characters.length - 1)
{
characters.splice(indexDot, 0, '.');
}
else if(indexDot < 0)
{
characters.unshift("0.", "0".repeat(-indexDot));
}
else
{
characters.push("0".repeat(indexDot - characters.length));
}
return (minus ? "-" : "") + characters.join("");
}
आप YourJS.fullNumber का भी उपयोग कर सकते हैं। उदाहरण के लिए YourJS.fullNumber(Number.MAX_VALUE)निम्नलिखित में परिणाम:
179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
यह वास्तव में छोटी संख्या के लिए भी काम करता है। YourJS.fullNumber(Number.MIN_VALUE)यह रिटर्न:
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
यह ध्यान रखना महत्वपूर्ण है कि यह फ़ंक्शन हमेशा परिमित संख्याओं को स्ट्रिंग्स के रूप में लौटाएगा लेकिन गैर-परिमित संख्याओं (जैसे NaNया Infinity) के रूप में लौटाएगा undefined।
आप इसे योरेज कंसोल में यहां से देख सकते हैं ।
आप उपयोग कर सकते हैं number.toString(10.1):
console.log(Number.MAX_VALUE.toString(10.1));
नोट: यह वर्तमान में क्रोम में काम करता है, लेकिन फ़ायरफ़ॉक्स में नहीं। विनिर्देश कहते हैं कि मूलांक का पूर्णांक होना चाहिए, इसलिए यह अविश्वसनीय व्यवहार करता है।
10.1 या 10कुछ भी नहीं के बराबर हैं।
मेरे पास oracle लौटने के वैज्ञानिक विवरण के साथ एक ही मुद्दा था, लेकिन मुझे एक url के लिए वास्तविक संख्या की आवश्यकता थी। मैंने केवल शून्य को घटाकर एक PHP चाल का उपयोग किया है, और मुझे सही संख्या मिलती है।
उदाहरण के लिए 5.4987E7 घाटी है।
newval = val - 0;
newval अब 54987000 के बराबर है