কীভাবে জাভাস্ক্রিপ্টে বিশাল সংখ্যার জন্য বৈজ্ঞানিক স্বরলিপি এড়ানো যায়?


182

জাভা স্ক্রিপ্ট সংখ্যাটি বড় হয়ে গেলে একটি বড় INT কে বৈজ্ঞানিক স্বরলিপিতে রূপান্তর করে । কীভাবে আমি এটি হতে রোধ করতে পারি?


1
আপনি কি 1E21 '100000000000000000000000' হিসাবে প্রদর্শন করতে চান? কীভাবে সংখ্যাটি প্রদর্শিত হয়, বা কীভাবে এটি সংরক্ষণ করা হয় তা নিয়ে কী আপনি উদ্বিগ্ন?
outis

3
এটি কীভাবে প্রদর্শিত হবে সে সম্পর্কে আমি উদ্বিগ্ন: আমার কাছে একটি ডকুমেন্ট রয়েছে w রাইট (মায়রিভেটেবল) কমান্ড
ক্রিস

1
আমার ইউআরএল এর অংশ হিসাবে নম্বরটি প্রয়োজন
ক্রিস

3
@ আউটিস: মানব ব্যবহারকারীরা কেবল সংখ্যাটি পড়তে চান না। দেখে মনে হচ্ছে translateবৈজ্ঞানিক স্বরলিপিতে স্থানাঙ্ক রয়েছে এমন রূপান্তরটির মুখোমুখি হওয়ার সময় ডি 3 ব্যতিক্রম করবে ।
বা ম্যাপার

2
আপনি যখন একটি নির্দিষ্ট আকার পর্যন্ত সংখ্যার সাথে ডিল করছেন তখন এটির জন্য এখনও একটি ব্যবহার রয়েছে। বৈজ্ঞানিক স্বরলিপি ব্যবহারকারীর পক্ষে পড়া শক্ত হবে যারা সর্বোপরি বৈজ্ঞানিক স্বরলিপি জানেন না।
হিপ্পিট্রেইল

উত্তর:


108

সংখ্যা. টু ফিক্সড রয়েছে তবে এটি বৈজ্ঞানিক স্বরলিপি ব্যবহার করে যদি সংখ্যাটি = = 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রাশিয়ান কৃষক গুণকে ব্যবহার করে সংজ্ঞা দিতে পারেন এবং এর পরিবর্তে এটি ব্যবহার করতে পারেন।

এই উত্তরটি কেবল প্রশ্নের প্রসঙ্গে প্রয়োগ করা উচিত: বৈজ্ঞানিক স্বরলিপি ব্যবহার না করেই বিশাল সংখ্যক প্রদর্শন করা। অন্য যে কোনও কিছুর জন্য আপনার একটি বিগআইন্ট লাইব্রেরি ব্যবহার করা উচিত , যেমন বিগনম্বার , লিমনের বিগইন্ট বা বিগইন্টিজার । এগিয়ে যেতে, নতুন নেটিভ বিগিয়ান্ট (দ্রষ্টব্য: লিমনের নয়) পাওয়া উচিত; এটির উপর ভিত্তি করে ক্রোমিয়াম এবং ব্রাউজারগুলি ( ক্রোম , নতুন এজ [v79 +], সাহসী ) এবং ফায়ারফক্স সবার সমর্থন রয়েছে; সাফারির সমর্থন চলছে।

আপনি এর জন্য কীভাবে বিগআইন্ট ব্যবহার করবেন তা এখানে: BigInt(n).toString()

উদাহরণ:

তবে, সাবধান , যে কোনও জাভাস্ক্রিপ্ট নম্বর হিসাবে বড় আউটপুট (কোনও বিগআইএন্ট নয়) যে আউটপুট আউটপুট আউটপুট 15-16 ডিজিটের বেশি (বিশেষত, Number.MAX_SAFE_INTEGER + 1[9,007,199,254,740,992] এর চেয়ে বেশি ) গোলাকার হতে পারে, কারণ জাভাস্ক্রিপ্টের সংখ্যা টাইপ (আইইইই -754 ডাবল-স্পষ্টতা) ভাসমান পয়েন্ট) সঠিকভাবে বিন্দুটির বাইরে সমস্ত পূর্ণসংখ্যাকে ধরে রাখতে পারে না। এর হিসাবে Number.MAX_SAFE_INTEGER + 1এটা, 2 গুণিতকে কাজ করছে তাই এটি বিজোড় সংখ্যা আর রাখা যাবে না (18,014,398,509,481,984 এবং similiarly, এটা 4 গুণিতক কর্মরত শুরু হয়, তারপর 8, তারপর 16, ...)।

ফলস্বরূপ, আপনি যদি BigIntসাপোর্টের উপর নির্ভর করতে পারেন, তবে BigIntফাংশনে আপনি যে স্ট্রিংটি পাঠাচ্ছেন সে হিসাবে আপনার নম্বরটি আউটপুট করুন :

const n = BigInt("YourNumberHere");

উদাহরণ:


আপনার সমাধানটি আমাকে ওল্ফ্রামালফার চেয়ে 2 ^ 1000 এর জন্য খুব আলাদা ফলাফল দেয়। কোন পয়েন্টার?
শেন রিসটল

4
@ শানে: এই প্রশ্নোত্তরটি ভাসমান পয়েন্ট সংখ্যাগুলি বেস -10 পূর্ণসংখ্যার হিসাবে প্রদর্শন করার বিষয়ে এবং এমন নম্বরগুলিকে সম্বোধন করে না যা ভাসমান পয়েন্ট ফর্ম্যাটে উপস্থাপন করা যায় না (যা বেস 10 এ রূপান্তর করার সময় উত্থাপিত হবে)। আপনার একটি জেএস বিগিন্ট লাইব্রেরি দরকার, যেমন চূড়ান্ত লাইনে উল্লিখিত হয়েছে।
outis

1
@ পিটার ওলসন: দেখে মনে হচ্ছে আমি এটিকে ছেড়ে দিয়েছি Math.abs। সতর্ক থাকুন জন্য ধন্যবাদ.
আউটিস

1
toFixed(Number.MAX_VALUE) == Number.MAX_VALUEঠিক তখনই ফিরে আসা উচিত, তবে তা হয় না ...
মানসথেমেট

3
প্রকৃতপক্ষে এই কোডটি খুব কম নেতিবাচক সংখ্যার জন্য কাজ করে না: টু ফিক্সড (-1E-20) -> "0.00000000000000000000.09999999999999999"
ডেভিডথিংস

44

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে সম্প্রতি সক্রিয় দেখায়। MDL to LocaleString

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"

আপনি আউটপুট ফর্ম্যাট করতে বিকল্প ব্যবহার করতে পারেন।

বিঃদ্রঃ:

১. দশমিক স্থানের পরে রাস্তায় নাম্বার.লোক্যালস্ট্রিং () round

const myNumb = 586084736227728377283728272309128120398;
console.log( myNumb.toLocaleString('fullwide', { useGrouping: false }) );

... আয় ...

586084736227728400000000000000000000000

অভিযুক্ত ফলাফলের মধ্যে নির্ভুলতা গুরুত্বপূর্ণ হলে এটি সম্ভবত অনাকাঙ্ক্ষিত।


2
এটি বোকা উত্তর।
আরিয়া

এটি ফ্যান্টমজেএস ২.১.১ এ কাজ করে না - এটি এখনও বৈজ্ঞানিক স্বরলিপিতে শেষ হয়। ভাল ক্রোম।
ডিম নেপোমন্যাসচিহ

1
এটি খুব ছোট দশমিকের জন্য কাজ করে না বলে মনে হচ্ছে: var myNumb = 0.0000000001; কনসোল.লগ (myNumb.toLocaleString ('ফুলডওয়াইড', {ব্যবহারগ্রুপিং: ভুয়া})));
eh1160

খুব ছোট দশমিকের ফর্ম্যাট করার জন্য কেউ ম্যাক্সিমিনসিগিনিফিকড ডিজিটস বিকল্প (সর্বাধিক 21) সেট করতে পারে:js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
স্যার। MaNiAl

20

স্বল্প সংখ্যার জন্য এবং আপনি জানেন যে আপনি কতগুলি দশমিক চান, আপনি ফিক্সড ব্যবহার করতে পারেন এবং তারপরে পিছনের জিরোগুলি সরাতে একটি রেজিএক্সপ্যাক ব্যবহার করতে পারেন।

Number(1e-7).toFixed(8).replace(/\.?0+$/,"") //0.000

26
আক্ষরিক অর্থে প্রশ্নটি বৃহত সংখ্যার জন্য জিজ্ঞাসা করা হয়েছে
swyx

1
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
ফিক্সড

15

আরও একটি সম্ভাব্য সমাধান:

function toFix(i){
 var str='';
 do{
   let a = i%10;
   i=Math.trunc(i/10);
   str = a+str;
 }while(i>0)
 return str;
}

7
এটি আসল মান সংরক্ষণ করে না ... উদাহরণস্বরূপ 31415926535897932384626433832795 31415926535897938480804068462624
শূন্য_কুল

ইতিবাচক নয় তবে সম্ভবত জাভাস্ক্রিপ্ট কীভাবে বিপুল সংখ্যক পরিচালনা করে।
শূন্য_কুল

@ডসন মূলত কারণ আইইইই ভাসমান পয়েন্ট সংখ্যাগুলি গাণিতিক প্রয়োগ করে। জাভাস্ক্রিপ্টে সংখ্যাগুলি আসলে ভাসমান পয়েন্ট সংখ্যা হিসাবে পাশাপাশি "দশমিক সংখ্যা" হিসাবে উপস্থাপিত হয়, কোনও স্থানীয় "পূর্ণসংখ্যার সঠিক টাইপ" থাকে না। : আপনি এখানে পড়তে পারেন medium.com/dailyjs/javascripts-number-type-8d59199db1b6
Pac0

@ জেরো_কুল এর চেয়ে বড় যে কোনও সংখ্যা Number.MAX_SAFE_INTEGERএই সমস্যায় ভুগতে পারে।
প্যাক 0

10

এখানে আমার 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"


আপনি যদি সংখ্যাটি তুলনা করেন।
মনস্তেমেট

4
@manonthemat অবশ্যই তারা সমান নয়, কারণ প্রথমটি একটি ফর্ম্যাট স্ট্রিং এবং দ্বিতীয়টি হ'ল a Number। যদি আপনি প্রথমটিকে একটিতে কাস্ট করেন তবে Numberদেখবেন যে তারা একেবারে সমান: jsfiddle.net/qd6hpnyx/1 । আপনি আপনার ডাউনটাতে ফিরিয়ে নিতে পারেন:P
ভিজিওএন

যথেষ্ট ন্যায্য .... আমি কেবল লক্ষ্য করেছি আমি পারব না, যদি না আপনি নিজের উত্তরটি সম্পাদনা করেন।
manonthemat

.0খালি স্ট্রিং দিয়ে যে কোনও পেছনে স্থান পরিবর্তন করা আরও ভাল ।
vsync

আমি চেষ্টা করার পরে আমি কিছুটা অদ্ভুত মান পেয়েছি console.log(2.2e307.toFixedSpecial(10))। মানে ... আমি বেশ কয়েকটি পিছনে জিরো পেয়েছি। যেকোন উপায়ে উত্সাহ দেওয়া কারণ এটি আমার যা প্রয়োজন তার থেকে নিকটতম বলে মনে হচ্ছে।
পিটার.পেট্রভ

6

নিম্নলিখিত সমাধানটি খুব বড় এবং খুব কম সংখ্যার জন্য স্বয়ংক্রিয় ক্ষতিকারক বিন্যাসটিকে বাইপাস করে। এটি একটি বাগফিক্সের সাথে আউটিসের সমাধান : এটি খুব অল্প সংখ্যক নেতিবাচক সংখ্যার জন্য কাজ করছে না।

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));


1
সংখ্যাটিস্ট্রিং (0.0000002) "0.00000019999999999999998"
রাফাদকো

1
@raphadko যে কুখ্যাত জাভাস্ক্রিপ্ট এর ফ্লোটিং পয়েন্ট স্পষ্টতা সমস্যা, যা অন্য সম্পূর্ণ ভিন্ন ব্যথা যখন জাতীয় ... দেখুন সংখ্যার ব্যবহার উদাহরণস্বরূপ stackoverflow.com/questions/1458633/...
user56reinstatemonica8

3

অন্যের উত্তরগুলি আপনাকে সঠিক নম্বর দেয় না!
এই ফাংশনটি পছন্দসই সংখ্যাটিকে নির্ভুলভাবে গণনা করে এবং এটি জাভাস্ক্রিপ্ট দ্বারা পরিবর্তন হওয়া থেকে রোধ করতে স্ট্রিংয়ে ফেরত দেয়!
যদি আপনার একটি সংখ্যাসূচক ফলাফল প্রয়োজন হয়, কেবলমাত্র এক নম্বর ফাংশনের ফলাফলকে গুণ করুন!

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;
}

এই কোড সম্পর্কে উত্তর সম্পর্কে কিছু অতিরিক্ত তথ্য সম্ভবত দরকারী হবে।
পাইভস

মন্তব্য ফাংশন যোগ।

2

ব্যবহার .toPrecision, .toFixedইত্যাদি ইত্যাদি আপনি নিজের সংখ্যায় অঙ্কের সংখ্যাটি স্ট্রিংয়ে রূপান্তর করে .toStringতার দিকে তাকিয়ে এটি গণনা করতে পারেন .length


কোনও কারণে, টপপ্রিসন কাজ করে না। যদি আপনি চেষ্টা করেন: window.examplenum = 1352356324623461346, এবং তারপরে সতর্কতাটি বলুন (window.examplenum.toPrecision (20)), এটি একটি সতর্কতা পপ আপ করবে না
ক্রিস

আসলে এটি কখনও কখনও বৈজ্ঞানিক স্বরলিপি দেখায় এবং অন্যান্য সময়ে এটি একেবারে পপ আপ হয় না s আমি কি ভুল করছি?
ক্রিস

18
প্রস্তাবের কোনওটিই বড় (বা ছোট) সংখ্যার জন্য কাজ করে না। (2e64).toString()ফিরে আসবে "2e+64", তাই .lengthঅকেজো।
কোডম্যানএক্স

2

এটিই আমি ইনপুট থেকে মানটি ব্যবহার করে শেষ করেছি, 17 ডিজিটের চেয়ে কম সংখ্যার প্রসারিত করব এবং এক্সফেনশিয়াল সংখ্যাকে x10 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;
  }
}

1

আপনি সংখ্যাটি লুপ করতে পারেন এবং গোলটি অর্জন করতে পারেন

// প্রদত্ত সূচকে চরটি প্রতিস্থাপন করতে কার্যকারিতা

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--;
 }
}

1

আমি সংখ্যাটির চেয়ে স্ট্রিং ফর্মের সাথে কাজ করার চেষ্টা করেছি এবং এটি কাজ করে বলে মনে হয়েছিল। আমি কেবল 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;
}

1

আমি মনে করি এখানে বেশ কয়েকটি অনুরূপ উত্তর থাকতে পারে তবে আমি এখানে একটি জিনিস এনেছি

// 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 ব্যবহার করার সময় সমস্যা হয়; এটি 10,000 হিসাবে বেস -10 এ 1000 লিখবে তাই আমি এটিকে লগ 10 এ পরিবর্তন করেছি কারণ লোকেরা বেশিরভাগ ক্ষেত্রেই বেস -10 ব্যবহার করবে।

এটি খুব সঠিক সমাধান নাও হতে পারে তবে এই বলে আমি গর্বিত যে এটি সফলভাবে সংখ্যার বেসগুলিতে অনুবাদ করতে পারে এবং কমাগুলির জন্য একটি বিকল্প নিয়ে আসে!


1

তোমার প্রশ্ন:

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

ভাল, সাবধান থাকুন যে bignumber.js ১৫ টি উল্লেখযোগ্য অঙ্ক ছাড়িয়ে যেতে পারে না ...
মাইকেল হুবার্গার

0

আমি জানি এটি বহু বছর পরে, কিন্তু আমি সম্প্রতি একই ধরণের বিষয়ে কাজ করেছিলাম এবং আমি আমার সমাধান পোস্ট করতে চেয়েছিলাম wanted বর্তমানে গৃহীত উত্তর প্যাডগুলি 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


@ ওরিওল - হ্যাঁ, আপনি ঠিক বলেছেন; আমি অনুমান করি যে আমি এর আগে যা চেষ্টা করেছি তা অন্যান্য কারণগুলির কারণে কেবল সেভাবেই কাজ করেছে। আমি আমার উত্তরে সেই ছোট্ট নোটটি সরিয়ে দেব।
andi

1
কাজ করে না:toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
মানসেমেট

0
function printInt(n) { return n.toPrecision(100).replace(/\..*/,""); }

কিছু সমস্যা সহ:

  • 0.9 "0" হিসাবে প্রদর্শিত হবে
  • -0.9 "-0" হিসাবে প্রদর্শিত হয়
  • 1e100 "1" হিসাবে প্রদর্শিত হয়
  • কেবলমাত্র ~ 1e99 => পর্যন্ত সংখ্যার জন্য কাজ করে বৃহত্তর সংখ্যার জন্য অন্যান্য ধ্রুবক ব্যবহার করে; বা অপ্টিমাইজেশনের জন্য ছোট।

হ্যাঁ এগুলি কিছু বিষয়।
অ্যাডাম লেগেট

0

নিয়মিত প্রকাশ প্রকাশ করা। এটিতে কোনও যথার্থ সমস্যা নেই এবং প্রচুর কোড নয়।

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));


-1

আপনি যদি কেবল এটি প্রদর্শনের জন্য করে থাকেন তবে অঙ্কগুলি গোল করার আগে আপনি অঙ্কগুলি থেকে একটি অ্যারে তৈরি করতে পারেন।

var num = Math.pow(2, 100);
var reconstruct = [];
while(num > 0) {
    reconstruct.unshift(num % 10);
    num = Math.floor(num / 10);
}
console.log(reconstruct.join(''));

এটি সঠিক উত্তরটি ফিরিয়ে দেবে, তবে অনেক সময় লাগবে এবং সময় কার্যকর হতে পারে।
হান্না মে

-1

বর্তমানে বৈজ্ঞানিক স্বরলিপি দ্রবীভূত করার কোনও দেশীয় কাজ নেই। তবে, এই উদ্দেশ্যে আপনার নিজের কার্যকারিতা লিখতে হবে।

এখানে আমার:

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("");
}

এটি সত্যই বড় সংখ্যার জন্য ব্যর্থ। আমি 2830869077153280552556547081187254342445169156730 চেষ্টা করেছিলাম এবং 28308690771532805000000000000000000000000000000
কলব্যাক

-1

আপনি থেকে ক্ষতিকারক মডিউলটি ব্যবহার করতে পারেন । এটি হালকা ও পুরোপুরি পরীক্ষিত।

import fromExponential from 'from-exponential';

fromExponential(1.123e-10); // => '0.0000000001123'

-1

আপনি আপনার জেএস.ফুল নাম্বারটিও ব্যবহার করতে পারেন। উদাহরণস্বরূপ YourJS.fullNumber(Number.MAX_VALUE)নিম্নলিখিত ফলাফল: 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

এটি সত্যিই অল্প সংখ্যক জন্যও কাজ করে। YourJS.fullNumber(Number.MIN_VALUE)এটি ফেরত দেয়: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005

এটি লক্ষণীয় যে এই ফাংশনটি সর্বদা সসীম সংখ্যাটিকে স্ট্রিং হিসাবে ফিরিয়ে দেয় তবে সসীম নম্বরের (যেমন। NaNবা Infinity) হিসাবে ফিরিয়ে দেয় undefined

আপনি এখানে আপনার জেএস কনসোলে এটি পরীক্ষা করতে পারেন ।


-3

আপনি ব্যবহার করতে পারেন number.toString(10.1):

console.log(Number.MAX_VALUE.toString(10.1));

দ্রষ্টব্য: এটি বর্তমানে ক্রোমে কাজ করে তবে ফায়ারফক্সে নয়। স্পেসিফিকেশনটি বলছে যে রেডিক্সকে একটি পূর্ণসংখ্যা হতে হবে, সুতরাং এটি অবিশ্বস্ত আচরণের ফলাফল।


হেক এটা কি করে? 10.1 এর একটি রেডিক্স?
জোনিবা

এটি কাজ করে না। ES5 যেহেতু, প্রয়োগের টিউমেন্টটিতে ToInteger ব্যবহার করা প্রয়োজন। সুতরাং ব্যবহার 10.1 বা 10কিছুই কিছুই সমান নয়।
ওরিওল

হ্যাঁ, এটি সত্যিই কিছুটা কাজ বন্ধ করে দিয়েছে। কিন্ডা দু: খিত, তবে এই উত্তরটি এখন অপ্রাসঙ্গিক।
জাম্বোনিফোফেক্স

-6

ওরাকল রিটার্নিং বৈজ্ঞানিক স্বরলিপি নিয়ে আমার একই সমস্যা ছিল, তবে url এর জন্য আমার আসল নম্বরটি দরকার ছিল। আমি কেবল শূন্যকে বিয়োগ করে একটি পিএইচপি কৌশল ব্যবহার করেছি এবং আমি সঠিক নম্বর পেয়েছি।

উদাহরণস্বরূপ 5.4987E7 হ'ল ভাল।

newval = val - 0;

নিউভাল এখন 54987000 এর সমান


2
এটির কোনও প্রভাব নেই। 5.4987E7 এর 21 এর চেয়ে কম এক্সপোশন রয়েছে, সুতরাং স্ট্রিংয়ে রূপান্তরিত না করে এটি সম্পূর্ণ সংখ্যা হিসাবে প্রদর্শিত হবে। (5.4987E21 - 0) .toString () => "5.4987e + 21"
ডুইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.