কীভাবে জাভাস্ক্রিপ্টে একটি ফ্লোট ফর্ম্যাট করবেন?


427

জাভাস্ক্রিপ্টে, যখন একটি ফ্লোট থেকে স্ট্রিংয়ে রূপান্তরিত হয়, তখন আমি কীভাবে দশমিক বিন্দুর পরে মাত্র 2 অঙ্ক পেতে পারি? উদাহরণস্বরূপ, 0.3445434 এর পরিবর্তে 0.34।


16
কিছুটা নিট-পিকিং: আপনি কি দুটি প্রথম সংখ্যা বাদে সমস্ত 'কাটা' করতে চান, না আপনি দুটি অঙ্কের মধ্যে গোল করতে চান?
xtofl

উত্তর:


232
var result = Math.round(original*100)/100;

কোডটি স্ব-ব্যাখ্যামূলক না হলে সুনির্দিষ্ট

সম্পাদনা: ... বা কেবল ব্যবহার করুন toFixed, টিম বাথের প্রস্তাবিত হিসাবে । স্মরণ করিয়ে দেওয়ার জন্য এটি ভুলে গেছেন, ধন্যবাদ (এবং একটি উত্তম) :)


1
আমি এটি লাইব্রেরিতে "হাইচার্ট" এ ব্যবহার করছিলাম যেখানে এটি স্ট্রিংয়ের মানগুলি গ্রহণ করে না তাই ফিক্সড আমার পক্ষে কাজ করেন নি, ম্যাথ.আউন্ড আমার সমস্যা সমাধান করেছে, ধন্যবাদ
স্বপ্নিল

4
toFixed()printf()সি তে কিছু করার মতো কি হবে তা নকল করে দিবে তবে toFixed()এবং Math.round()বিভিন্নভাবে গোলকে পরিচালনা করবে। এই ক্ষেত্রে, toFixed()প্রভাব একই সাজানোর থাকবে Math.floor()হবে (মঞ্জুর 10 করে মূল গুন করছি ^ এন পূর্বেই, আর কলিং আছে toFixed()এন সংখ্যার সহ)। উত্তরের "নির্ভুলতা" ওপি এখানে কী চায় তার উপর খুব নির্ভর করে এবং উভয়ই তাদের নিজস্ব উপায়ে "সঠিক"।
DDPWNAGE

838

রাউন্ড সংখ্যার ফাংশন রয়েছে। উদাহরণ স্বরূপ:

var x = 5.0364342423;
print(x.toFixed(2));

5.04 মুদ্রণ করা হবে।

সম্পাদনা: ফিজল


7
আমি একটি ব্রাউজার যদিও মুদ্রণ () ব্যবহারের বিরুদ্ধে সুপারিশ করবে
cobbal

70
এটি সম্পর্কে সতর্ক হন, টু ফিক্সড () একটি স্ট্রিং প্রদান করে: var x = 5.036432346; var y = x.toFixed(2) + 100; yসমান হবে"5.03100"
ভ্লাদ

5
সচেতন থাকুন (1e100) .ToFixed (2) === "1e + 100"
qbolec

7
এছাড়াও, বেমানান রাউন্ডিং থেকে সাবধান থাকুন: (0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
স্কিপি লে গ্র্যান্ড গৌরও

3
আপনি toFixed একটি সমতুল্য কিন্তু সামঞ্জস্যপূর্ণ রাউন্ডইং, ব্যবহার toLocaleString দিয়ে অনুসন্ধান যদি: (0.345) .toLocaleString ( 'স্বীকারোক্তি-en', {minimumFractionDigits: 2, maximumFractionDigits: 2})
fred727

185

ব্যবহার করার সময় সতর্কতা অবলম্বন করুন toFixed():

প্রথমত, সংখ্যার বৃত্তাকার উপস্থাপনা ব্যবহার করে সংখ্যার বৃত্তাকার কাজ করা হয় যা অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে। উদাহরণ স্বরূপ

(0.595).toFixed(2) === '0.59'

পরিবর্তে '0.6'

দ্বিতীয়ত, এখানে একটি আই.ই. বাগ রয়েছে toFixed()। আইই (কমপক্ষে সংস্করণ 7 পর্যন্ত, আই 88 পরীক্ষা করে না), নিম্নলিখিতটি সত্য বলে ধরেছে:

(0.9).toFixed(0) === '0'

Kkyy এর পরামর্শ অনুসরণ করা বা একটি কাস্টম toFixed()ফাংশন ব্যবহার করা যেমন একটি ভাল ধারণা হতে পারে , যেমন

function toFixed(value, precision) {
    var power = Math.pow(10, precision || 0);
    return String(Math.round(value * power) / power);
}

হ্যাঁ, দামগুলি পূর্বাভাস দেওয়ার জন্য কোড তৈরি করার সময় এটি খুব গুরুত্বপূর্ণ হতে পারে। ধন্যবাদ! +1
ফ্যাবিও মিলহিরো

10
আমি .toFixed()রিটার্ন ভ্যালুতে দেশীয় পদ্ধতি যুক্ত করার পরামর্শ দেব , যা প্রয়োজনীয় পরিমাণ নির্ভুলতা যুক্ত করবে, যেমন: return (Math.round(value * power) / power).toFixed(precision);এবং মানটিকে স্ট্রিং হিসাবেও ফিরিয়ে দেয়। অন্যথায়, 20 এর নির্ভুলতা ছোট দশমিকের জন্য উপেক্ষা করা হবে
উইলিয়াম জস ক্রোক্রফ্ট

3
সম্পর্কিত একটি নোট toFixed: নোট করুন যে নির্ভুলতা বৃদ্ধি করা অপ্রত্যাশিত ফলাফল আনতে পারে: (1.2).toFixed(16) === "1.2000000000000000"যখন, (1.2).toFixed(17) === "1.19999999999999996"(ফায়ারফক্স / ক্রোমে; আইই 8-তে পরবর্তীকালে আইই 8 অভ্যন্তরীণভাবে অফার করতে পারে এমন কম নির্ভুলতার কারণে এটি ধরা দেয় না)।
jakub.g

2
এমনকি (0.598).toFixed(2)উত্পাদন করে না দয়া করে নোট করুন 0.6। এটি উত্পাদন করে 0.60:)
qbolec

1
এছাড়াও, inconstistent রাউন্ডইং থেকে সাবধান থেকো, (0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
স্কিপি লে গ্র্যান্ড গৌরু

36

আরও একটি সমস্যা সম্পর্কে সচেতন হতে হবে, সেটি হ'ল toFixed()সংখ্যার শেষে অহেতুক শূন্য তৈরি করতে পারে। উদাহরণ স্বরূপ:

var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"

ধারণাটি হ'ল একটি ব্যবহার করে আউটপুট পরিষ্কার করা RegExp:

function humanize(x){
  return x.toFixed(6).replace(/\.?0*$/,'');
}

RegExpনিশ্চিত করুন যে এটি পূর্ণসংখ্যার জন্য ভাল হিসাবে ভাল দেখায় করতে trailing শূন্য (এবং ঐচ্ছিকরূপে দশমিক পয়েন্ট) সাথে মেলে।

humanize(23-7.37)
"15.63"
humanize(1200)
"1200"
humanize(1200.03)
"1200.03"
humanize(3/4)
"0.75"
humanize(4/3)
"1.333333"

সংখ্যা.প্রোটোটাইপ.মিনফিক্সড = ফাংশন (দশমিক) {এটি ফিরিয়ে দিন to ফিক্সড (দশমিক) re। স্থান (/ \? 0 * $ /, ""); }
লুক ব্লুম

এটি গ্রহণ করা উচিত, পেছনের শূন্যগুলি বিরক্তিকর, আমি এই সমাধানটি ঠিক খুঁজছিলাম, জিজে।
exoslav

1
ট্রেলিং শূন্যগুলি বিরক্তিকর হতে পারে, তবে পদ্ধতিটির নাম "টু
ফিক্সড


6

গুণকগুলি ব্যবহার করে চারপাশে ভাসমান solutions সমস্ত সমাধানে একটি সমস্যা আছে। দুর্ভাগ্যক্রমে কিকি এবং ক্রিস্টোফের উভয় সমাধানই ভুল।

সংখ্যার জন্য আপনার কোড পরীক্ষা দয়া করে 551.175 2 দশমিক স্থান দিয়ে - এটি সুসম্পন্ন হবে 551,17 যখন এটি হওয়া উচিত 551,18 ! তবে আপনি যদি প্রাক্তন জন্য পরীক্ষা। 451.175 এটি ঠিক থাকবে - 451.18। সুতরাং এই ত্রুটিটিকে প্রথম নজরে চিহ্নিত করা শক্ত।

সমস্যাটি সংখ্যাবৃদ্ধির সাথে: 551.175 * 100 = 55117.49999999999 (আপগুলি!) চেষ্টা করে দেখুন

সুতরাং আমার ধারণাটি ম্যাথ.াউন্ড () ব্যবহার করার আগে টু ফিক্সড () দিয়ে চিকিত্সা করা;

function roundFix(number, precision)
{
    var multi = Math.pow(10, precision);
    return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}

1
জেএস-তে পাটিগণিতের ক্ষেত্রে এটিই সমস্যা: (551.175 * 10 * 10)! == (551.175 * 100)। আসল দশমিক ফলাফলের জন্য আপনাকে কমা স্থানান্তর করতে দশমিক বৃদ্ধি ব্যবহার করতে হবে।
কির কানোজ

এটি দেখার জন্য +1, তবে toFixedপাশাপাশি প্রভাবিত হয় - (0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)… যে কোনও পদ্ধতি ব্যবহার করা হোক না কেন, গোল করার আগে একটি অ্যাপসিলন আরও ভালভাবে যুক্ত করুন।
স্কিপি লে গ্র্যান্ড গৌরো

5

আমি এখানে অনুমান করা চাবিটি হ'ল প্রথমে সঠিকভাবে গোল করা, তারপরে আপনি এটিকে স্ট্রিংয়ে রূপান্তর করতে পারেন।

function roundOf(n, p) {
    const n1 = n * Math.pow(10, p + 1);
    const n2 = Math.floor(n1 / 10);
    if (n1 >= (n2 * 10 + 5)) {
        return (n2 + 1) / Math.pow(10, p);
    }
    return n2 / Math.pow(10, p);
}

// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34

এখন আপনি নিরাপদে এই মানটিকে ফিক্সড (পি) দিয়ে ফর্ম্যাট করতে পারবেন। সুতরাং আপনার নির্দিষ্ট ক্ষেত্রে:

roundOf(0.3445434, 2).toFixed(2); // 0.34


1
function trimNumber(num, len) {
  const modulu_one = 1;
  const start_numbers_float=2;
  var int_part = Math.trunc(num);
  var float_part = String(num % modulu_one);
      float_part = float_part.slice(start_numbers_float, start_numbers_float+len);
  return int_part+'.'+float_part;
}

আপনি সেমিকোলন অনুপস্থিত ব্যতীত দুর্দান্ত উত্তর (না, এস 6 mic সেমিকোলনে অচল নয় এবং আমাদের এখনও কিছু ক্ষেত্রে সেগুলি ব্যবহার করতে হবে)। আমাকে এখানে সর্বশেষ সারিটিও সম্পাদনা করতে হয়েছিল: return float_part ? int_part+'.'+float_part : int_part;অন্যথায় আপনি যদি পূর্ণসংখ্যায় উত্তীর্ণ হন তবে এটি শেষে বিন্দু দিয়ে নম্বরটি ফিরে আসে (উদাহরণস্বরূপ ইনপুট 21002100.
:,

0

সম্ভবত আপনিও দশমিক বিভাজক চাইবেন? আমি সবেমাত্র তৈরি একটি ফাংশন এখানে:

function formatFloat(num,casasDec,sepDecimal,sepMilhar) {
    if (num < 0)
    {
        num = -num;
        sinal = -1;
    } else
        sinal = 1;
    var resposta = "";
    var part = "";
    if (num != Math.floor(num)) // decimal values present
    {
        part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded)
        while (part.length < casasDec)
            part = '0'+part;
        if (casasDec > 0)
        {
            resposta = sepDecimal+part;
            num = Math.floor(num);
        } else
            num = Math.round(num);
    } // end of decimal part
    while (num > 0) // integer part
    {
        part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits
        num = Math.floor(num/1000);
        if (num > 0)
            while (part.length < 3) // 123.023.123  if sepMilhar = '.'
                part = '0'+part; // 023
        resposta = part+resposta;
        if (num > 0)
            resposta = sepMilhar+resposta;
    }
    if (sinal < 0)
        resposta = '-'+resposta;
    return resposta;
}

0

X.xx5 এর সাথে মূল্যের গুণাগুণ বা বিভাগকে ব্যবহার করে প্রকৃত মান হিসাবে অসামঞ্জস্যপূর্ণ বৃত্তাকার এড়ানোর কোনও উপায় নেই। আপনার যদি সঠিক মূল্যগুলির ক্লায়েন্ট-সাইড গণনা করতে হয় তবে আপনার সমস্ত পরিমাণ সেন্টে রাখা উচিত। এটি জাভাস্ক্রিপ্টে সংখ্যার মানগুলির অভ্যন্তরীণ উপস্থাপনের প্রকৃতির কারণে। লক্ষ্য করুন যে এক্সেল একই সমস্যায় ভুগছে তাই বেশিরভাগ লোকেরা এই ঘটনার ফলে ঘটে যাওয়া ছোট ত্রুটিগুলি লক্ষ্য করবেন না। তবে যখনই আপনি প্রচুর গণিত মান যুক্ত করেন ত্রুটিগুলি জমে উঠতে পারে, চূড়ান্ত ফলাফলের ত্রুটিটি হ্রাস করার জন্য গণনার ক্রম এবং অন্যান্য পদ্ধতির সাথে জড়িত একটি পুরো তত্ত্ব রয়েছে। দশমিক মান সহ সমস্যাগুলির উপর জোর দেওয়ার জন্য, দয়া করে নোট করুন যে 0.1 + 0.2 জাভাস্ক্রিপ্টে ঠিক 0.3 এর সমান নয়, যখন 1 + 2 3 এর সমান।


সমাধানটি পুরো অংশ এবং দশমিক অংশকে পৃথক করা এবং ভাসমান ব্যবহার না করে বেস 10 তে পূর্ণসংখ্যার হিসাবে প্রতিনিধিত্ব করা হবে, এটি এটি সুন্দর ছাপানোর জন্য সমস্যা ছাড়াই কাজ করে, তবে সাধারণভাবে আপনাকে বেস এবং অন্যটির মধ্যে বেছে নিতে হয়, যার জন্য একটি প্রতিনিধিত্ব বাস্তব সংখ্যা এবং আরেকটি হতে থাকে নিজ নিজ সমস্যা রয়েছে
reuns

"এক্সেল একই সমস্যায় ভুগছে"। সূত্র ?
gaurav5430

0
/** don't spend 5 minutes, use my code **/
function prettyFloat(x,nbDec) { 
    if (!nbDec) nbDec = 100;
    var a = Math.abs(x);
    var e = Math.floor(a);
    var d = Math.round((a-e)*nbDec); if (d == nbDec) { d=0; e++; }
    var signStr = (x<0) ? "-" : " ";
    var decStr = d.toString(); var tmp = 10; while(tmp<nbDec && d*tmp < nbDec) {decStr = "0"+decStr; tmp*=10;}
    var eStr = e.toString();
    return signStr+eStr+"."+decStr;
}

prettyFloat(0);      //  "0.00"
prettyFloat(-1);     // "-1.00"
prettyFloat(-0.999); // "-1.00"
prettyFloat(0.5);    //  "0.50"

0

আমি এই কোডটি ফ্লোটস ফর্ম্যাট করতে ব্যবহার করি। এটি ভিত্তিক toPrecision()তবে এটি অপ্রয়োজনীয় শূন্যগুলি বাদ দেয়। আমি কীভাবে রেজেক্সকে সহজীকরণের জন্য পরামর্শগুলি স্বাগত জানাব।

function round(x, n) {
    var exp = Math.pow(10, n);
    return Math.floor(x*exp + 0.5)/exp;
}

ব্যবহারের উদাহরণ:

function test(x, n, d) {
    var rounded = rnd(x, d);
    var result = rounded.toPrecision(n);
    result = result.replace(/\.?0*$/, '');
    result = result.replace(/\.?0*e/, 'e');
    result = result.replace('e+', 'e');
    return result;  
}

document.write(test(1.2000e45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2000e+45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2340e45, 3, 2) + '=' + '1.23e45' + '<br>');
document.write(test(1.2350e45, 3, 2) + '=' + '1.24e45' + '<br>');
document.write(test(1.0000, 3, 2) + '=' + '1' + '<br>');
document.write(test(1.0100, 3, 2) + '=' + '1.01' + '<br>');
document.write(test(1.2340, 4, 2) + '=' + '1.23' + '<br>');
document.write(test(1.2350, 4, 2) + '=' + '1.24' + '<br>');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.