জাভাস্ক্রিপ্ট: গোলাকার সংখ্যাকে এন দশমিকগুলিতে ফর্ম্যাট করে


104

জাভাস্ক্রিপ্টে, কোনও সংখ্যাটিকে N দশমিক স্থানে গোল করার সাধারণ উপায়টি হ'ল:

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

তবে এই পদ্ধতির সর্বাধিক এন দশমিক স্থানে গোল হবে যখন আমি সর্বদা এন দশমিক স্থানে গোল করতে চাই । উদাহরণস্বরূপ "২.০" কে "2" এ গোল করা হবে।

কোন ধারনা?


9
সাধারণত, আপনি toFixed()( ডেভেলপার.মোজিলা.আর.ইং / কোর_জাভাস্ক্রিপ্ট_1.5_ উল্লেখ / ) ব্যবহার করতে পারেন তবে এটি আই-তে বগি: স্ট্যাকওভারফ্লো / প্রশ্ন / 661562/… ; আপনাকে নিজের সংস্করণটি লিখতে হবে ...
ক্রিস্টোফ

1
@ হুজু - সম্ভবত স্বীকৃত উত্তরটি পরিবর্তন করুন - আইভি 8 + এর জন্য ডেভিডের উত্তর সঠিক, অন্যদিকে ব্রাউজারে স্বীকৃত উত্তরের কিছু গুরুতর বাগ রয়েছে।
রোবোক্যাট

@ আরবোক্যাট: আপনি কি সিরিয়াস?
গুফা

উত্তর:


25

এটি কোনও বৃত্তাকার প্রবলেম নয়, এটি একটি ডিসপ্লে সমস্যা। একটি সংখ্যাতে উল্লেখযোগ্য অঙ্কগুলি সম্পর্কিত তথ্য থাকে না; মান 2 2.0000000000000000 এর সমান। এটি যখন আপনি বৃত্তাকার মানটিকে একটি স্ট্রিংয়ে পরিণত করেন যা আপনি এটি একটি নির্দিষ্ট সংখ্যার অঙ্ক প্রদর্শন করে থাকেন।

আপনি কেবল সংখ্যার পরে জিরো যুক্ত করতে পারেন, এরকম কিছু:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(নোট করুন যে এটি অনুমান করে যে ক্লায়েন্টের আঞ্চলিক সেটিংস দশমিক বিভাজক হিসাবে সময়কাল ব্যবহার করে, কোডটি অন্যান্য সেটিংসের জন্য কাজ করতে আরও কিছু কাজ প্রয়োজন))


3
টু ফিক্সডটি বগি ... উদাহরণস্বরূপ দশমিক: 1.02449999998 আপনি যদি dec.toFixed (4) => 1.0244 করেন। পরিবর্তে এটি 1.0245 হওয়া উচিত ছিল।
ব্যাট_প্রোগ্রামার

2
@ প্রদীপক তবে toFixed()গোল করার পরে দশমিক প্যাড ব্যবহার করে কী সমস্যা হবে ?
পাওলোয়

10
@ প্রদীপক কি ব্রাউজারে? সবেমাত্র এটি ক্রোম 17 এ চেষ্টা করে 1.02449999998.toFixed(4)সঠিকভাবে ফিরে আসে 1.0245
ম্যাট বল

3
@ মার্কটমলিন: তারপরে মনে হচ্ছে আপনার একটি সংখ্যার পরিবর্তে একটি স্ট্রিং রয়েছে।
গুফা

1
.TOFixed () আধুনিক ব্রাউজারগুলিতে উজ্জ্বলতার সাথে কাজ করে (আমি ক্রোম, ফায়ারফক্স, আই 11, IE8 পরীক্ষা করেছি)। @ ব্যাট_প্রোগ্রামার - দয়া করে আপনার কোন ব্রাউজারগুলিতে সেই বাগটি রয়েছে বলে পরিষ্কার করুন rif
রোবোকট

243

আমি মনে করি যে এখানে দেওয়া সমস্তগুলির জন্য আরও সহজ পদ্ধতি রয়েছে এবং এটি Number.toFixed()ইতিমধ্যে জাভাস্ক্রিপ্টে প্রয়োগ করা পদ্ধতি ।

সহজভাবে লিখুন:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

ইত্যাদি ...


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

@ ডেভিড: এটি উত্তরের মন্তব্যে উল্লেখ করা হয়েছে, উদাহরণস্বরূপ।
গুফা

13
সাবধানতা: toFixed()একটি স্ট্রিং দেয়।
জর্দান আর্সেনো 22

2
@ জোর্দান আরসেনো এটি পার্সেন্ট (মাইনিम्बर.টো ফিক্সড (ইনটওয়ার)) ব্যবহার করে স্থির করা যেতে পারে; একটি পূর্ণসংখ্যার মান, বা পার্সফ্লোট (myNumber.toFixed (ফ্লোটভার)) ফেরত দিতে; যদি ব্যবহারকারী দশমিক স্থান থাকে তবে একটি ফ্লোট ফেরত দিতে।
স্টিফেন রোমেরো

50

আমি একটি উপায় খুঁজে পেয়েছি। এটি ঠিক আছে সহ ক্রিস্টফের কোড:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

অ্যারে কনস্ট্রাক্টর ব্যবহার করে একটি চরিত্র পুনরাবৃত্তি করার বিশদটি এখানে পড়ুন যদি আপনি আগ্রহী হন তবে কেন আমি "+ 1" যুক্ত করেছি।


আমার জন্য 2 বা 3 ফলাফলের নির্ভুলতা সহ 708.333333333333333 এর মান দিয়ে পাস করা আমার জন্য 708.00 এর ফেরতের মান হিসাবে ফলাফল। ক্রোম এবং আই 9। টো ফিক্সড (2) এ আমার 2 দশমিক স্থানের জন্য আমার প্রয়োজনগুলি পূরণ করেছে।
অ্যালান

এটি সাধারণ উপায় নয়, উদাহরণস্বরূপ, টিক্সড (16.775, 2) 16.77 রিটার্ন করুন। সংখ্যাটি স্ট্রিংয়ে রূপান্তর করুন তারপরে রূপান্তর হ'ল একমাত্র উপায়।
হাইওয়ে

2
এই পদ্ধতির সাথে একটি ত্রুটি রয়েছে: টু ফিক্সড (-0.1111, 2) 0.11 প্রদান করে, অর্থাৎ নেতিবাচক চিহ্নটি হারিয়ে গেছে।
ম্যাট

দুর্দান্ত কাজ করে, বাদে আমি শেষে পার্সফ্লোট (ফলাফল) যুক্ত করেছি। একটি সম্পাদনা মূল্যবান।
আর্তুর বারশেঘিয়ান

16

জিনিসগুলি করার জন্য সবসময় আরও ভাল উপায় থাকে।

var number = 51.93999999999761;

আমি চার অঙ্কের নির্ভুলতা পেতে চাই: 51.94

শুধু কর:

number.toPrecision(4);

ফলাফল হবে: 51.94


2
এবং যদি আপনি 100 যোগ করেন? আপনার কি এটিকে নাম্বারে পরিবর্তন করতে হবে? প্রিসিজন (5)?
জনিবিজল

2
হ্যাঁ. 31.939383.toPrecision (4)> "31.94" / 131.939383.toPrecision (4)> "131.9"
রিস্প্পএন

6

পিএইচপি-এর মতো গোল করার পদ্ধতি

নীচের কোডটি ম্যাথ.গ্রাউন্ডের নিজস্ব সংস্করণটি আপনার নিজের নেমস্পেসে যুক্ত করতে ব্যবহার করা যেতে পারে যা যথার্থ পরামিতি নেয়। উপরের উদাহরণে দশমিক রাউন্ডের বিপরীতে, এটি স্ট্রিংগুলিতে এবং থেকে কোনও রূপান্তর সম্পাদন করে না এবং নির্ভুলতা প্যারামিটার পিএইচপি এবং এক্সেলের মতো একইভাবে কাজ করে যার ফলে ধনাত্মক 1 টি 1 দশমিক স্থানে এবং -1 দশকে চলে যাবে।

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

ম্যাথ.াউন্ড () এর জন্য মজিলা বিকাশকারী রেফারেন্স থেকে


2

আশাকরি কাজের কোড (খুব বেশি পরীক্ষা করা হয়নি):

function toFixed(value, precision) {
    var precision = precision || 0,
        neg = value < 0,
        power = Math.pow(10, precision),
        value = Math.round(value * power),
        integral = String((neg ? Math.ceil : Math.floor)(value / power)),
        fraction = String((neg ? -value : value) % power),
        padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}

আপনার কোডটিতে একটি বাগ রয়েছে। আমি ফিক্সডের চেষ্টা করেছি (2.01, 4) এবং "2.100" এর ফলাফল পেয়েছি got আমি যদি কখনও এটির সমাধানের উপায় খুঁজে পাই তবে আমি এই প্রশ্নের উত্তর হিসাবে পোস্ট করব।
ইলিয়াস জামারিয়া

@ মাইকেজ ৩০২: প্যাডিং গণনাটি একের পরে বন্ধ ছিল; এখনই কাজ করা উচিত, তবে যদি এটি এখনও ভেঙে যায় তবে আমাকে আবার বাগ দিতে দ্বিধা বোধ করবেন ...
ক্রিস্টোফ

খুব অদ্ভুত. আমি ফায়ারফক্স 17 এ খোলা ফায়ারবগ কনসোল দিয়ে যখন এই ফিকশনটি চালাচ্ছি তখন এটি পুরো ব্রাউজারকে জমে যায় যেমন জেএস একটি অন্তহীন লুপে ধরা পড়ে। এমনকি যদি আমি আউটপুট কনসোল না করি। আমার যদি ফায়ারব্যাগ সক্রিয় না হয় তবে বাগটি ঘটে না not
সাবলিমারিক

1
আপডেট করুন, আমি এটি ক্রোমে চালিয়েছি এবং পেয়েছি: আনকচড রেঞ্জেরর: টু ফিক্সড ফাংশন কলের ক্ষেত্রে সর্বাধিক কল স্ট্যাকের আকার ছাড়িয়ে গেছে।
সাবলিমারিক

@ সুবলিমারিক: কেন এমন হয় তা আমার কোনও ধারণা নেই; অন্ধকারে গুলি করা: ফাংশনটির নতুন নামকরণের চেষ্টা করুন ...
ক্রিস্টোফ

2

আমি মনে করি নীচে ফাংশন সাহায্য করতে পারে

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

ব্যবহার: roundOff(600.23458,2);ফিরে আসবে600.23


2

এটি এন অঙ্কগুলিতে গোল করার জন্য কাজ করে (আপনি যদি কেবল এন অঙ্কগুলিতে ছাঁটাই করতে চান তবে ম্যাথ.উন্ড কলটি সরিয়ে ফেলুন এবং ম্যাথ ট্রাঙ্ক ব্যবহার করুন):

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

অতীতে জাভাতে এই জাতীয় যুক্তির অবলম্বন করতে হয়েছিল যখন আমি ডেটা ম্যানিপুলেশন ই-স্লেট উপাদানগুলি লেখি । যেহেতু আমি জানতে পেরেছি যে 0 বারে 0.1 বার যোগ করার পরে আপনি কিছু অপ্রত্যাশিতভাবে দীর্ঘ দশমিক অংশটি শেষ করতে চান (এটি ভাসমান পয়েন্ট গণিতের কারণে) is

ফর্ম্যাট নম্বরে একজন ব্যবহারকারী সর্বদা 2 দশমিক স্থান দেখানোর জন্য এই কৌশলটিকে স্কেলিং বলে।

কিছু উল্লেখ রয়েছে যেগুলি প্রত্যাশার মতো হয় না এবং http://www.jacklmoore.com/notes/rounding-in-javascript/ এ এর পরিবর্তে প্রস্তাবিত হয়:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}

বিটিডব্লিউ, পজিসটি ভবিষ্যতের এইচ / ডাব্লু
জর্জ বীরবিলিস

-2

আপনি যদি গোলটি করার বিষয়ে সত্যই যত্নশীল না হন তবে স্রেফ একটি ফিক্সড (এক্স) যুক্ত করুন এবং তারপরে ট্রেইলিং 0es এবং প্রয়োজনীয়তার সাথে বিন্দুটি সরিয়ে ফেলুন। এটি একটি দ্রুত সমাধান নয়।

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}

আমি চেষ্টা করেছি format(1.2, 5)এবং পেয়েছিলাম 1.2, যখন আমি প্রত্যাশা ছিল 1.20000
ইলিয়াস জামারিয়া

দুঃখিত, ইলিয়াসজামারিয়া, এটি প্রথমে বুঝতে পারিনি। আমি পোস্টটি সম্পাদনা করেছি। কেবলমাত্র নোট করুন যে মানটি নির্ধারিত না হলে এটি "0.0000" ফিরে আসবে।
জুয়ান ক্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.