সর্বোচ্চ 2 দশমিক স্থানে গোল (কেবল প্রয়োজন হলে)


2754

আমি সর্বাধিক 2 দশমিক স্থানে গোল করতে চাই তবে কেবল প্রয়োজনে

ইনপুট:

10
1.7777777
9.1

আউটপুট:

10
1.78
9.1

আমি কীভাবে জাভাস্ক্রিপ্টে এটি করতে পারি?


22
: আমি এখানে সমাধান হিসাবে দেওয়া কৌশল অনেক সঙ্গে একটি বেহালার করেছি ... তাই আপনি তুলনা করতে পারবেন বেহালার
dsdsdsdsd

37
কেউ সচেতন বলে মনে হয় না Number.EPSILON। ব্যবহার Math.round( num * 100 + Number.EPSILON ) / 100
ক্রাউনভেল

3
নতুন পাঠকদের জন্য আপনার স্ট্রিং ধরণের ফলাফল না থাকলে আপনি এটি করতে পারবেন না । সংখ্যার বাইনারি অভ্যন্তরীণ উপস্থাপনার উপর ভাসমান পয়েন্ট গণিতের অর্থ সর্বদা এমন সংখ্যা থাকে যা ঝরঝরে দশমিক হিসাবে উপস্থাপন করা যায় না।
ওয়ালফ

9
@ ক্রোনভেল আপনি Number.EPSILONএখানে ব্যবহারের কারণ ব্যাখ্যা করতে পারেন ?
ব্রুস সান

5
আমি খরগোশের গর্ত থেকে পড়ে গিয়ে এই পৃষ্ঠায় আরও কয়েকটি আকর্ষণীয় উত্তর পরীক্ষা করেছি (কেবলমাত্র প্রথম পৃষ্ঠা)। এখানে একটি কোডেন । ইঙ্গিত: উত্তরটি যত বেশি upvotes, তত কম এটি সঠিকভাবে কাজ করার সম্ভাবনা রয়েছে।
অ্যাডাম জাগোসজ

উত্তর:


3486

ব্যবহার Math.round(num * 100) / 100

সম্পাদনা করুন: 1.005 রাউন্ডের মতো জিনিসগুলি সঠিকভাবে নিশ্চিত করতে, আমরা ব্যবহার করি

Math.round((num + Number.EPSILON) * 100) / 100


395
যদিও এটি বেশিরভাগ ক্ষেত্রে কাজ করবে, এটি 1.005 এর জন্য কাজ করবে না যা 1.01 এর পরিবর্তে 1 হবে
জেমস

83
@ জেমস বাহ এটি সত্যই অদ্ভুত- আমি ক্রোম দেব কনসোলে কাজ করছি এবং আমি এটি লক্ষ করছি যে 1.005 * 100 = 100.49999999999999। ম্যাথ.াউন্ড (100.49999999999999) 100 এ মূল্যায়ন করে, যেখানে ম্যাথ.াউন্ড (100.5) 101-এ মূল্যায়ন করে IE আইই9 একই কাজ করে। এটি জাভাস্ক্রিপ্টে ভাসমান পয়েন্ট অদ্ভুততার
stinkycheeseman

153
একটি সাধারণ কাজ। 2 ডিপি এর জন্য ব্যবহার করুন Math.round((num + 0.00001) * 100) / 100। চেষ্টা করুন Math.round((1.005 + 0.00001) * 100) / 100এবংMath.round((1.0049 + 0.00001) * 100) / 100
mrkschan

31
@ শ্রীকশান কেন এটি কাজ করে, এবং এটি সমস্ত সংখ্যার জন্য বোকা?
সিএমসিডিগ্রাগনকাই

86
আপনারা যারা এটি পান না তাদের জন্য এই কৌশলটি স্কেলিং বলে। মূলত উত্তরটি এখানে যা করে তা হ'ল দশমিক বিন্দু জুড়ে দুটি পরিসংখ্যানকে সমস্ত পাগল ভাসমান বিন্দু সম্পর্কিত সমস্যাগুলি এড়ানোর জন্য চিত্রটিকে পুরো সংখ্যায় পরিণত করে এবং তার পরে এটি 100 এর সাথে ভাগ করে পূর্বে যা হয়েছিল তা অনুবাদ করে এবং আপনার নিজের 2dp উত্তর।
অ্যালেক্স_নবু

3060

মানটি যদি পাঠ্যের প্রকার হয়:

parseFloat("123.456").toFixed(2);

মানটি যদি একটি নম্বর হয়:

var numb = 123.23454;
numb = numb.toFixed(2);

একটি নেতিবাচক দিক রয়েছে যে 1.5 এর মতো মানগুলি আউটপুট হিসাবে "1.50" দেবে। @ মিনিটেক দ্বারা প্রস্তাবিত একটি ফিক্স:

var numb = 1.5;
numb = +numb.toFixed(2);
// Note the plus sign that drops any "extra" zeroes at the end.
// It changes the result (which is a string) into a number again (think "0 + foo"),
// which means that it uses only as many digits as necessary.

দেখে মনে হচ্ছে Math.roundএটি আরও ভাল সমাধান। তবে তা নয়! কিছু ক্ষেত্রে এটি সঠিকভাবে গোল হবে না :

Math.round(1.005 * 1000)/1000 // Returns 1 instead of expected 1.01!

toFixed () এছাড়াও হবে না বৃত্তাকার সঠিকভাবে কিছু ক্ষেত্রে (যেমন, Chrome v.55.0.2883.87 পরীক্ষিত)!

উদাহরণ:

parseFloat("1.555").toFixed(2); // Returns 1.55 instead of 1.56.
parseFloat("1.5550").toFixed(2); // Returns 1.55 instead of 1.56.
// However, it will return correct result if you round 1.5551.
parseFloat("1.5551").toFixed(2); // Returns 1.56 as expected.

1.3555.toFixed(3) // Returns 1.355 instead of expected 1.356.
// However, it will return correct result if you round 1.35551.
1.35551.toFixed(2); // Returns 1.36 as expected.

আমার ধারণা, 1.515 আসলে পর্দার আড়ালে 1.55499994 এর মতো কিছু কারণ এটি is

সমাধান 1 হ'ল প্রয়োজনীয় বৃত্তাকার অ্যালগরিদম সহ একটি স্ক্রিপ্ট ব্যবহার করা হয়, উদাহরণস্বরূপ:

function roundNumber(num, scale) {
  if(!("" + num).includes("e")) {
    return +(Math.round(num + "e+" + scale)  + "e-" + scale);
  } else {
    var arr = ("" + num).split("e");
    var sig = ""
    if(+arr[1] + scale > 0) {
      sig = "+";
    }
    return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + scale)) + "e-" + scale);
  }
}

https://plnkr.co/edit/uau8BlS1cqbvWPCHJeOy?p=preview

দ্রষ্টব্য: এটি সবার কাছে সর্বজনীন সমাধান নয়। বিভিন্ন বিভিন্ন বৃত্তাকার অ্যালগরিদম রয়েছে, আপনার প্রয়োগ বিভিন্ন হতে পারে, আপনার প্রয়োজনীয়তার উপর নির্ভর করে। https://en.wikipedia.org/wiki/Rounding

সমাধান 2 হ'ল সামনের শেষের গণনাগুলি এড়ানো এবং ব্যাকএন্ড সার্ভার থেকে বৃত্তাকার মানগুলি টান।


81
এটির একটি (টো ফিক্সড) পদ্ধতিটি ভাল, এবং আমার পক্ষে কাজ করেছে, তবে এটি "শুধুমাত্র যখন প্রয়োজন তখনই" মূল অনুরোধটি মেনে চলে না । (এটি 1.5 থেকে 1.50 এর চতুর্দিকে, যা চশমাটি ভেঙে দেয়))
প্রতি লন্ডবার্গ

29
: "যখন প্রয়োজন" প্রয়োজন জন্য, এই কি parseFloat(number.toFixed(decimalPlaces)); @PerLundberg
হল Onur ইলদিরিম

36
parseFloat("55.555").toFixed(2)"55.55"ক্রোম দেব কনসোলে ফিরে আসে ।
লেভি বোটেলহো

22
ম্যাথ.াউন্ডের পরিবর্তে টু ফিক্সড ব্যবহার করার কোনও সুবিধা নেই; টু ফিক্সড একই গোলাকার সমস্যাগুলির দিকে নিয়ে যায় (5.555 এবং 1.005 দিয়ে এগুলি ব্যবহার করে দেখুন) তবে এটি ম্যাথ.গ্রাউন্ডের চেয়ে ধীরে ধীরে 500x (মজা করার মতো নয়) মত মনে হচ্ছে ... @ মার্ককি উত্তরটি এখানে আরও সঠিক বলে মনে হচ্ছে।
পিয়েরে

17
টু ফিক্সড "মাঝে মাঝে" স্ট্রিং দেয় না, এটি সর্বদা স্ট্রিং দেয়।
ম্যাকগুয়ারভি 10

464

তুমি ব্যবহার করতে পার

function roundToTwo(num) {    
    return +(Math.round(num + "e+2")  + "e-2");
}

আমি এটি এমডিএন- তে পেয়েছি । তাদের উপায় উল্লেখ করা হয়েছিল যে 1.005 সঙ্গে সমস্যা এড়ানো ।

roundToTwo(1.005)
1.01
roundToTwo(10)
10
roundToTwo(1.7777777)
1.78
roundToTwo(9.1)
9.1
roundToTwo(1234.5678)
1234.57

13
@ রেডস্যান্ড্রো, +(val)এটি ব্যবহারের জবরদস্তি সমতুল্য Number(val)। "E-2" কে একটি সংখ্যার সাথে যুক্ত করে তোলার ফলে একটি স্ট্রিং আসে যা একটি সংখ্যায় ফিরে যেতে হয়।
জ্যাক 19

41
সাবধান থাকুন যে বড় এবং ক্ষুদ্র ভাসমানগুলির জন্য যেহেতু NaN উত্পাদন করে, যেমন + "1e-21 + 2" সঠিকভাবে পার্স করা যাবে না।
পিয়েরে

16
আপনি '1.005' সমস্যাটি 'সমাধান করেছেন', তবে একটি নতুন সমস্যা প্রবর্তন করেছেন: এখন, ক্রোম কনসোলে, roundToTwo(1.0049999999999999)1.01 হিসাবে প্রকাশিত হবে (অবশ্যম্ভাবী থেকেই 1.0049999999999999 == 1.005)। আমার কাছে মনে হচ্ছে আপনি num = 1.005'স্পষ্টতই' টাইপ করলে আপনি যে ফ্লোটটি পেয়েছেন তা '1.00' এর চেয়ে বেশি হওয়া উচিত, কারণ সংখ্যার সঠিক মান 1.005 এর চেয়ে কম। অবশ্যই, আমার কাছে এটিও মনে হয় যে '1.005' 'স্ট্রিংটি অবশ্যই স্পষ্টতই' 'এর সাথে 1.01 করতে হবে। প্রকৃত সঠিক আচরণটি এখানে কী তা সম্পর্কে বিভিন্ন ব্যক্তির বিভিন্ন অন্তর্দৃষ্টি রয়েছে বলে মনে হচ্ছে এটি জটিল কেন এটি জটিল।
মার্ক আমেরিকা

35
না (ফ্লোটিং পয়েন্ট) মধ্যে এক নম্বর নেই 1.0049999999999999এবং 1.005তাই সংজ্ঞা দ্বারা, তারা একই সংখ্যা রয়েছে। একে ডেডিকাইন্ড কাট বলে।
আজমিসভ

6
@ আজমিসভ ঠিক আছে। যদিও 1.00499 < 1.005হয় true, 1.0049999999999999 < 1.005মূল্যায়ণ false
ফ্যালকনপল

146

মার্কজির উত্তরটি সঠিক। দশমিক জায়গাগুলির জন্য এখানে জেনেরিক এক্সটেনশন।

Number.prototype.round = function(places) {
  return +(Math.round(this + "e+" + places)  + "e-" + places);
}

ব্যবহার:

var n = 1.7777;    
n.round(2); // 1.78

ইউনিট পরীক্ষা:

it.only('should round floats to 2 places', function() {

  var cases = [
    { n: 10,      e: 10,    p:2 },
    { n: 1.7777,  e: 1.78,  p:2 },
    { n: 1.005,   e: 1.01,  p:2 },
    { n: 1.005,   e: 1,     p:0 },
    { n: 1.77777, e: 1.8,   p:1 }
  ]

  cases.forEach(function(testCase) {
    var r = testCase.n.round(testCase.p);
    assert.equal(r, testCase.e, 'didn\'t get right number');
  });
})

20
পিয়ারি মার্কজির উত্তর নিয়ে একটি গুরুতর বিষয় উত্থাপন করেছিলেন।
dsjoerg

9
দ্রষ্টব্য: আপনি যদি নম্বর.প্রোটোটাইপটি পরিবর্তন করতে না চান - কেবল এটি একটি ফাংশন হিসাবে লিখুন: function round(number, decimals) { return +(Math.round(number + "e+" + decimals) + "e-" + decimals); }
ফিলিপ সিপম্যান

2
এটি প্রসারিত করার একটি দুর্দান্ত উপায়। দশমিকটি নেতিবাচক কিনা তা আপনি পরীক্ষা করতে পারেন তবে ই + এবং ই- উল্টান। তারপরে এন = 115; n.round (-2); 100
লি লুভিয়ের

3
N: 1e + 19 চেষ্টা করুন - এটি NaN ফেরত দেয়
ডেভিডজে

3
এই অ্যালগরিদম সর্বদা গোল হয় (শূন্য থেকে দূরে পরিবর্তে)। সুতরাং, নেতিবাচক সংখ্যার ক্ষেত্রে, আউটপুটটি আপনি প্রত্যাশা করতে পারেন তা নয়:(-1.005).round(2) === -1
আলেকসেজ কমারভ

123

আপনার ব্যবহার করা উচিত:

Math.round( num * 100 + Number.EPSILON ) / 100

কেউ সচেতন বলে মনে হয় না Number.EPSILON

এছাড়াও এটি লক্ষণীয় যে এটি কোনও জাভাস্ক্রিপ্টের অদ্ভুততা নয় যা কিছু লোক বলেছে।

এটি কেবল কম্পিউটারে ভাসমান পয়েন্ট সংখ্যাগুলি কাজ করে। ৯৯% প্রোগ্রামিং ভাষার মতো, জাভাস্ক্রিপ্টটিতে হোম ফ্লোটিং পয়েন্ট সংখ্যা নেই; এটি তার জন্য সিপিইউ / এফপিইউর উপর নির্ভর করে। একটি কম্পিউটার বাইনারি ব্যবহার করে, এবং বাইনারিতে, এর মতো কোনও সংখ্যা নেই 0.1, তবে এটির জন্য কেবল একটি বাইনারি অনুমান ima কেন? ১/৩ এর বেশি একই কারণে দশমিক অর্থে লেখা যায় না: এর মান ০.৩৩৩৩৩৩৩৩৩ ... ত্রিশের অসীমের সাথে।

এই যে Number.EPSILON। এই সংখ্যাটি ডাবল নির্ভুলতা ভাসমান পয়েন্ট সংখ্যায় বিদ্যমান 1 এবং পরবর্তী সংখ্যাটির মধ্যে পার্থক্য । এটি হ'ল: 1এবং 1 + এর মধ্যে কোনও নম্বর নেই Number.EPSILON

সম্পাদনা করুন:

মন্তব্যে যেমন জিজ্ঞাসা করা হয়েছিল, আসুন একটি বিষয় স্পষ্ট করে বলি: যোগ করার Number.EPSILONসময় কেবল তখনই প্রাসঙ্গিক হয় যখন বৃত্তাকার মানটি একটি গাণিতিক ক্রিয়াকলাপের ফলস্বরূপ হয়, কারণ এটি কিছু ভাসমান পয়েন্ট ত্রুটি ডেল্টাকে গ্রাস করতে পারে।

যখন মূল্য সরাসরি উত্স থেকে আসে (যেমন: আক্ষরিক, ব্যবহারকারী ইনপুট বা সেন্সর) এটি কার্যকর হয় না।

সম্পাদনা (2019):

@ ম্যাগানাপের মতো এবং কিছু লোক নির্দেশ করেছে, Number.EPSILONগুণ করার আগে যোগ করা ভাল :

Math.round( ( num + Number.EPSILON ) * 100 ) / 100

সম্পাদনা (ডিসেম্বর 2019):

ইদানীং, আমি অ্যাপসিলন-সচেতন সংখ্যার তুলনা করার জন্য এটির মতো একটি ফাংশন ব্যবহার করি:

const ESPILON_RATE = 1 + Number.EPSILON ;
const ESPILON_ZERO = Number.MIN_VALUE ;

function epsilonEquals( a , b ) {
  if ( Number.isNaN( a ) || Number.isNaN( b ) ) {
    return false ;
  }
  if ( a === 0 || b === 0 ) {
    return a <= b + EPSILON_ZERO && b <= a + EPSILON_ZERO ;
  }
  return a <= b * EPSILON_RATE && b <= a * EPSILON_RATE ;
}

আমার ব্যবহারের ক্ষেত্রটি একটি দৃ +়তা + ডেটা বৈধতা লিব যা আমি বহু বছর ধরে বিকাশ করছি।

প্রকৃতপক্ষে, কোডটিতে আমি ব্যবহার করছি ESPILON_RATE = 1 + 4 * Number.EPSILONএবং EPSILON_ZERO = 4 * Number.MIN_VALUE(এপসিলনের চারগুণ), কারণ আমি ভাসমান পয়েন্ট ত্রুটির সংমিশ্রণের জন্য একটি সাম্যতা পরীক্ষক যথেষ্ট looseিলা চাই।

এখনও পর্যন্ত, এটি আমার জন্য নিখুঁত দেখাচ্ছে। আমি আশা করি এটি সাহায্য করবে


1
@ পালোটা আপনি ইপিসিলন ক্রোনভেলের মতো উল্লেখযোগ্য একটি টাইন নম্বর সংজ্ঞায়িত করতে পারেন
ড্যানিয়েল সান

3
এটাই সঠিক উত্তর! সমস্যাটি নিজেই কীভাবে জাভাস্ক্রিপ্ট সম্পর্কে নয়, অভ্যন্তরীণভাবে ফ্লোট সংখ্যাগুলি কাজ করে তার সাথে সম্পর্কিত
ড্যানিয়েল সান

22
প্রকৃতপক্ষে, আপনাকে 100 দ্বারা গুণিত করার আগে অ্যাপসিলন যুক্ত করতে হবে Math.round( (num + Number.EPSILON) * 100) / 100। আমিও সম্মত হ'ল সঠিকভাবে গোল করার জন্য এটি সঠিক পদ্ধতি (যদিও এটি এই প্রশ্নে যা বলা হয়েছিল ঠিক তা নয়)।
maganap

2
পছন্দ করুন তুমি ঠিক বলছো; দিকনির্দেশনা পছন্দ করে তোলে। সুতরাং আমি অনুমান করি যে আমার বাকী আপত্তিটি কেবলমাত্র এটি হ'ল যদি আপনি এমন কোনও ডোমেইনে কাজ করছেন যেখানে আপনার মানটি একটি "গোল সংখ্যা" বলে মনে করার মূলত কারণ পেয়েছে if যদি আপনি জানেন যে আপনার ইনপুটটি সংখ্যার দশমিক জায়গাগুলির সংখ্যায় সাধারণ গাণিতিক ক্রিয়াকলাপের ফলাফল, তবে নিশ্চিত হোন যে আপনার সম্ভবত কেবলমাত্র 0.004999999999999999যৌগিক ভাসমান পয়েন্টের ত্রুটির ফলস্বরূপ এবং গাণিতিকভাবে সঠিক ফলাফল সম্ভবত 0.005 ছিল। যদি এটি একটি সেন্সর থেকে পড়া? খুব বেশি না.
মার্ক অ্যামেরি

1
@ মার্চওস এটি ব্যর্থ হয় না: অর্ধেকটি সর্বদা গোল হয়ে যায় । যেমন Math.round(1.5)= 2, তবে Math.round(-1.5)= -1। সুতরাং এটি পুরোপুরি সামঞ্জস্যপূর্ণ। এখানে -1 -2 এর চেয়ে বড়, ঠিক -1000 -1000.01 এর চেয়ে বড়। বৃহত্তর পরম সংখ্যা নিয়ে বিভ্রান্ত হওয়ার দরকার নেই ।
ক্রোভেল

84

এক ব্যবহার করতে পারেন .toFixed(NumberOfDecimalPlaces)

var str = 10.234.toFixed(2); // => '10.23'
var number = Number(str); // => 10.23

4
এছাড়াও এটি পিছনে জিরো যুক্ত করে কারণ এটি মূল প্রশ্নটি যা চেয়েছিল তা নয়
অ্যালাস্টার মাউ

2
তবে চলমান শূন্যগুলি সহজেই একটি রেইজেক্সের সাথে ছাঁটাই করা হয়, যেমন `সংখ্যা (10.10000.toFixed (2)। রিপ্লেস (/ 0 + $ /, ''))` => 10.1
চাদ

1
@ ডানিয়েল শীর্ষ উত্তর একই (এখনকার হিসাবে) তবে তা হয় না সঠিকভাবে ঘুরবে না, চেষ্টা করুন পরিবর্তে +(1.005).toFixed(2)কোনটি ফিরে আসে । 11.01
এমিল বার্গারন

3
@ চ্যাডএমসিইলিগোট: আপনার রেজিেক্সগুলি পূর্ণসংখ্যার সাথে ভালভাবে কাজ করে না: Number(9).toFixed(2).replace(/0+$/, '')=> "9."
জ্যাকব ভ্যান লিনজেন

মনে হচ্ছে এটি গোল হয়ে যায় না। এটি কেবলমাত্র মূলত ছাঁটাই। কিছু ক্ষেত্রে, যথেষ্ট ভাল! ধন্যবাদ।
iedmrc

78

এই প্রশ্নটি জটিল।

ধরুন আমাদের একটি ফাংশন রয়েছে, roundTo2DP(num)এটি একটি আর্গুমেন্ট হিসাবে ভাসিয়ে নেয় এবং 2 টি দশমিক জায়গায় গোল করে একটি মান দেয়। এই প্রতিটি প্রকাশের মূল্যায়ন করা উচিত কী?

  • roundTo2DP(0.014999999999999999)
  • roundTo2DP(0.0150000000000000001)
  • roundTo2DP(0.015)

'সুস্পষ্ট' উত্তরটি হ'ল প্রথম উদাহরণটি 0.01 এর সাথে গোল হওয়া উচিত (কারণ এটি 0.02 এর তুলনায় 0.01 এর কাছাকাছি) এবং অন্য দুটি 0.02 এর কাছাকাছি হওয়া উচিত (কারণ 0.015000000000000000001 0.01 থেকে 0.01 এর কাছাকাছি এবং কারণ 0.015 এর মাঝামাঝি মাঝখানে তাদের এবং একটি গাণিতিক সম্মেলন রয়েছে যে এই জাতীয় সংখ্যাগুলি গোল হয়ে যায়)।

আপনি যে ক্যাপটি অনুমান করতে পারেন, তা হ'ল roundTo2DP সম্ভবত সেই স্পষ্ট উত্তরগুলি দেওয়ার জন্য বাস্তবায়ন করা যায় না , কারণ এতে পাস হওয়া তিনটি নম্বরই একই সংখ্যা । আইইইই 754 বাইনারি ফ্লোটিং পয়েন্ট সংখ্যা (জাভাস্ক্রিপ্ট দ্বারা ব্যবহৃত ধরণের) হুবহু বেশিরভাগ অ-পূর্ণসংখ্যার সংখ্যা উপস্থাপন করতে পারে না এবং সুতরাং উপরের তিনটি সংখ্যাসূচক অক্ষরটি একটি কাছের বৈধ ভাসমান পয়েন্ট সংখ্যাটিতে গোলাকার হয়ে যায়। এই সংখ্যাটি যেমন হয় তেমনি ঠিক ঠিক

0,01499999999999999944488848768742172978818416595458984375

যা 0.02 এর চেয়ে 0.01 এর কাছাকাছি।

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

> 0.014999999999999999 === 0.0150000000000000001
true

সুতরাং যখন আমি লিখি m = 0.0150000000000000001, আমি যেটিরm সাথে শেষ করি তার সঠিক মানটি তার 0.01চেয়ে বেশি কাছাকাছি 0.02। এবং এখনও, যদি আমি রূপান্তর করিm একটি স্ট্রিংয়ে ...

> var m = 0.0150000000000000001;
> console.log(String(m));
0.015
> var m = 0.014999999999999999;
> console.log(String(m));
0.015

... আমি 0.015 পেয়েছি, যা 0.02 এর মধ্যে হওয়া উচিত, এবং যা লক্ষণীয় নয় 56-দশমিক স্থানের নম্বরটি আমি আগে বলেছি যে এই সংখ্যার সমস্তটি ঠিক সমান ছিল। তাহলে এটি কি অন্ধকার যাদু?

উত্তর নাম ECMAScript স্পেসিফিকেশন পাওয়া যেতে পারে, বিভাগে 7.1.12.1: ToString নম্বর টাইপ করুন প্রয়োগ । এখানে কিছু সংখ্যার মিটারকে একটি স্ট্রিংয়ে রূপান্তর করার নিয়ম স্থির করা হয়েছে। মূল অংশ বিন্দু 5, যা একটি পূর্ণসংখ্যা গুলি উৎপন্ন হয় যার সংখ্যা স্ট্রিং উপস্থাপনা ব্যবহার করা হবে মিটার :

দিন এন , , এবং গুলি পূর্ণসংখ্যার যেমন যে হতে ≥ 1, 10 -1গুলি <10 জন্য নম্বর মান গুলি × 10 এন - হয় মি , এবং সম্ভব ছোট হয়। লক্ষ্য করুন k এর দশমিক প্রতিনিধিত্ব ডিজিটের সংখ্যা গুলি , যে গুলি 10 দ্বারা বিভাজ্য নয়, এবং যে অন্তত উল্লেখযোগ্য অঙ্ক গুলি অগত্যা স্বতন্ত্র এই শর্তগুলির সাথে কর্তৃক নির্ধারিত করা হয় না।

এখানে মূল অংশটি হ'ল প্রয়োজনীয় " কে যতটা সম্ভব ছোট"। কি যে প্রয়োজন পরিমাণ প্রয়োজন যে দেওয়া একটি সংখ্যা m, মান String(m)থাকা আবশ্যক ডিজিটের অন্তত সম্ভব সংখ্যা এখনও প্রয়োজন যে পরিতৃপ্ত Number(String(m)) === m। যেহেতু আমরা এটি ইতিমধ্যে জানি0.015 === 0.0150000000000000001 , এটি এখন কেন স্পষ্ট String(0.0150000000000000001) === '0.015'হবে তা সত্য।

অবশ্যই, এই আলোচনার কেউ সরাসরি উত্তর দেওয়া হয়েছে কি roundTo2DP(m) করা উচিত ফিরে। যদি mএর সঠিক মান 0.01499999999999999944488848768742172978818416595458984375 হয় তবে এর স্ট্রিং প্রতিনিধিত্ব '0.015' হয় তবে তার মানটি কী সঠিক উত্তরটি কী - গাণিতিকভাবে, ব্যবহারিকভাবে, দার্শনিকভাবে বা যাই হোক না কেন - যখন আমরা এটি দুটি দশমিক স্থানে গোল করি?

এর কোনও একক সঠিক উত্তর নেই। এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। আপনি সম্ভবত স্ট্রিং প্রতিনিধিত্বকে সম্মান করতে এবং উপরের দিকে গোল করতে চান:

  • প্রতিনিধিত্ব করা হচ্ছে মানটি অন্তর্নিহিত পৃথক, যেমন দিনারগুলির মতো 3-দশমিক স্থান মুদ্রায় পরিমাণ মুদ্রা। এই ক্ষেত্রে, সত্য 0.015 মত একটি সংখ্যা মান হয় 0.015 এবং 0,0149999999 ... উপস্থাপনা এটি বাইনারি ফ্লোটিং পয়েন্ট পায় একটি rounding ত্রুটি। (অবশ্যই, অনেক যুক্তিযুক্তভাবে যুক্তিযুক্ত হতে পারে যে, এই জাতীয় মানগুলি পরিচালনা করার জন্য আপনার দশমিক পাঠাগার ব্যবহার করা উচিত এবং এগুলি প্রথম স্থানে বাইনারি ভাসমান পয়েন্ট নম্বর হিসাবে উপস্থাপন করবেন না))
  • মানটি কোনও ব্যবহারকারী টাইপ করেছিলেন। এক্ষেত্রে আবার, প্রবেশ করা ঠিক দশমিক সংখ্যাটি নিকটতম বাইনারি ভাসমান পয়েন্ট উপস্থাপনার চেয়ে বেশি 'সত্য'।

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

এই দুটি পদ্ধতির জন্য আলাদা কোড দরকার। সংখ্যার স্ট্রিং প্রতিনিধিত্বকে সম্মান জানাতে, আমরা যখন স্কুলে আপনি যে একই অ্যালগরিদম ব্যবহার করেছিলেন আপনি স্কুলে ব্যবহৃত একই অ্যালগরিদমটি ব্যবহার করে, আমরা (নিজস্ব যুক্তিযুক্ত সূক্ষ্ম কোডের একটি বিট সহ) স্ট্রিং উপস্থাপনার উপর সরাসরি কাজ করে তা আমাদের নিজস্ব বৃত্তাকার প্রয়োগ করতে পারি can কিভাবে গোল করার সংখ্যা শেখানো হয়েছিল। নীচে একটি উদাহরণ যা দশমিক পয়েন্টের পরে পিছনে শূণ্যগুলি কেড়ে নিয়ে "কেবল তখনই প্রয়োজন হয়" সংখ্যাকে 2 দশমিক স্থানে প্রতিনিধিত্ব করার জন্য ওপি'র প্রয়োজনীয়তার সম্মান করে; আপনার অবশ্যই এটি আপনার যথাযথ প্রয়োজনগুলিতে সামঞ্জস্য করতে হবে।

/**
 * Converts num to a decimal string (if it isn't one already) and then rounds it
 * to at most dp decimal places.
 *
 * For explanation of why you'd want to perform rounding operations on a String
 * rather than a Number, see http://stackoverflow.com/a/38676273/1709587
 *
 * @param {(number|string)} num
 * @param {number} dp
 * @return {string}
 */
function roundStringNumberWithoutTrailingZeroes (num, dp) {
    if (arguments.length != 2) throw new Error("2 arguments required");

    num = String(num);
    if (num.indexOf('e+') != -1) {
        // Can't round numbers this large because their string representation
        // contains an exponent, like 9.99e+37
        throw new Error("num too large");
    }
    if (num.indexOf('.') == -1) {
        // Nothing to do
        return num;
    }

    var parts = num.split('.'),
        beforePoint = parts[0],
        afterPoint = parts[1],
        shouldRoundUp = afterPoint[dp] >= 5,
        finalNumber;

    afterPoint = afterPoint.slice(0, dp);
    if (!shouldRoundUp) {
        finalNumber = beforePoint + '.' + afterPoint;
    } else if (/^9+$/.test(afterPoint)) {
        // If we need to round up a number like 1.9999, increment the integer
        // before the decimal point and discard the fractional part.
        finalNumber = Number(beforePoint)+1;
    } else {
        // Starting from the last digit, increment digits until we find one
        // that is not 9, then stop
        var i = dp-1;
        while (true) {
            if (afterPoint[i] == '9') {
                afterPoint = afterPoint.substr(0, i) +
                             '0' +
                             afterPoint.substr(i+1);
                i--;
            } else {
                afterPoint = afterPoint.substr(0, i) +
                             (Number(afterPoint[i]) + 1) +
                             afterPoint.substr(i+1);
                break;
            }
        }

        finalNumber = beforePoint + '.' + afterPoint;
    }

    // Remove trailing zeroes from fractional part before returning
    return finalNumber.replace(/0+$/, '')
}

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

> roundStringNumberWithoutTrailingZeroes(1.6, 2)
'1.6'
> roundStringNumberWithoutTrailingZeroes(10000, 2)
'10000'
> roundStringNumberWithoutTrailingZeroes(0.015, 2)
'0.02'
> roundStringNumberWithoutTrailingZeroes('0.015000', 2)
'0.02'
> roundStringNumberWithoutTrailingZeroes(1, 1)
'1'
> roundStringNumberWithoutTrailingZeroes('0.015', 2)
'0.02'
> roundStringNumberWithoutTrailingZeroes(0.01499999999999999944488848768742172978818416595458984375, 2)
'0.02'
> roundStringNumberWithoutTrailingZeroes('0.01499999999999999944488848768742172978818416595458984375', 2)
'0.01'

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

(বিকল্প হিসাবে, আপনি গোলাকার 10 গ্রন্থাগারটিও চেষ্টা করতে পারেন যা বুনোভাবে আলাদা বাস্তবায়নের সাথে অনুরূপ আচরণের ফাংশন সরবরাহ করে))

তবে আপনার যদি দ্বিতীয় ধরণের সংখ্যা থাকে - অবিচ্ছিন্ন স্কেল থেকে নেওয়া একটি মান, যেখানে কম দশমিক স্থানের সাথে আনুমানিক দশমিক উপস্থাপনা বেশি রয়েছে তাদের তুলনায় আরও নির্ভুল বলে মনে করার কোনও কারণ নেই ? সেক্ষেত্রে আমরা করি না স্ট্রিং উপস্থাপনা সম্মান চান কারণ যে উপস্থাপনা (বৈশিষ্ট ব্যাখ্যা হিসাবে) আগে থেকেই বাছাই করা অফ বৃত্তাকার; আমরা "0.014999999 ... 0.015 পর্যন্ত 375 রাউন্ড, যা 0.02 অবধি, তাই 0.014999999 ... 0.02 পর্যন্ত 0.05" পর্যন্ত ভুল বলতে চাই না।

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

/**
 * Takes a float and rounds it to at most dp decimal places. For example
 *
 *     roundFloatNumberWithoutTrailingZeroes(1.2345, 3)
 *
 * returns 1.234
 *
 * Note that since this treats the value passed to it as a floating point
 * number, it will have counterintuitive results in some cases. For instance,
 * 
 *     roundFloatNumberWithoutTrailingZeroes(0.015, 2)
 *
 * gives 0.01 where 0.02 might be expected. For an explanation of why, see
 * http://stackoverflow.com/a/38676273/1709587. You may want to consider using the
 * roundStringNumberWithoutTrailingZeroes function there instead.
 *
 * @param {number} num
 * @param {number} dp
 * @return {number}
 */
function roundFloatNumberWithoutTrailingZeroes (num, dp) {
    var numToFixedDp = Number(num).toFixed(dp);
    return Number(numToFixedDp);
}

এটি কিছু প্রান্ত ক্ষেত্রে কাজ করে না: চেষ্টা করুন ( jsfiddle ) এর সাথে roundStringNumberWithoutTrailingZeroes(362.42499999999995, 2)। প্রত্যাশিত ফলাফল (পিএইচপি হিসাবে echo round(362.42499999999995, 2)): 362.43। আসল ফলাফল:362.42
ডাঃ জিয়ানলুইগি জেন ​​জ্যানেটিনি

1
@ ডাঃ জিয়ানলুইগিজেনেজেটিটিনি হুহ। রহস্যময়। আমি নিশ্চিত নই কেন roundপিএইচপি'র 362.43 দেয়। এটি স্বজ্ঞাতভাবে ভুল বলে মনে হচ্ছে, যেহেতু 362.42499999999995 362.425 এর চেয়ে কম (গণিতে এবং কোডে - 362.42499999999995 < 362.425জেএস এবং পিএইচপি উভয় ক্ষেত্রেই সত্য)। পিএইচপি এর উত্তর মূল এবং বৃত্তাকার ভাসমান পয়েন্ট সংখ্যাগুলির মধ্যে দূরত্ব হ্রাস করে না 362.43 - 362.42499999999995 > 362.42499999999995 - 362.42Php.net/manual/en/function.round.php অনুসারে , পিএইচপি এর roundসি 99 মান অনুসরণ করে; কী চলছে তা বুঝতে আমাকে সি-এর ভূমিতে প্রবেশ করতে হবে।
মার্ক

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

1
@ ডাঃ জিয়ানলুইগি জানেজেটিটিিনি আমি একটি বাগ রিপোর্ট তৈরি করেছি: বাগস.এফপিএন
মার্ক অ্যামেরি

2
@ ডাঃ জিয়ানলুইগি জানেজেটিটিিনি "আমি কি কোনও ধারণা রাখি?" - না; রাউন্ডিং কীভাবে কাজ করে তা নয়। 1.000005 পাঁচটি সমাপ্ত হয়, তবে নিকটতম পূর্ণসংখ্যার সাথে গোল করে উত্তরটি 1 হওয়া উচিত, 2 নয় Like একইভাবে, 1499995 পাঁচটিতে শেষ হয়, তবে যদি নিকটতম মিলিয়নে গোল হয় তবে ফলাফলটি 1000000 হবে, 2000000 নয়। 362.42499999999995 এর ক্ষেত্রে ২ ডিপি-র গোল করা হচ্ছে, গোলাকার দিকটি কী নির্ধারণ করা উচিত তৃতীয় দশমিক স্থান, যা ৪
মার্ক অ্যামেরি

76

বিবেচনা করুন .toFixed()এবং .toPrecision():

http://www.javascriptkit.com/javatutors/formatnumber.shtml


1
টু ফিক্সড যাই হোক না কেন প্রতিটি মান দশমিক পয়েন্ট যুক্ত করে।
দুর্গন্ধযুক্ত চিজম্যান

13
দু'জনেই এখানে অকেজো
এসাইলাইজা

দুর্ভাগ্যক্রমে, উভয় ফাংশন অতিরিক্ত দশমিক স্থান যুক্ত করবে যা @ স্টিংকিচিজম্যান না চান বলে মনে হয়।
jackwanders


2
তারা স্ট্রিং
ফিরিয়েছে

63

একটি নির্দিষ্ট বৃত্তাকার পদ্ধতি। সূত্র: মজিলা

(function(){

    /**
     * Decimal adjustment of a number.
     *
     * @param   {String}    type    The type of adjustment.
     * @param   {Number}    value   The number.
     * @param   {Integer}   exp     The exponent (the 10 logarithm of the adjustment base).
     * @returns {Number}            The adjusted value.
     */
    function decimalAdjust(type, value, exp) {
        // If the exp is undefined or zero...
        if (typeof exp === 'undefined' || +exp === 0) {
            return Math[type](value);
        }
        value = +value;
        exp = +exp;
        // If the value is not a number or the exp is not an integer...
        if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
            return NaN;
        }
        // Shift
        value = value.toString().split('e');
        value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
        // Shift back
        value = value.toString().split('e');
        return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
    }

    // Decimal round
    if (!Math.round10) {
        Math.round10 = function(value, exp) {
            return decimalAdjust('round', value, exp);
        };
    }
    // Decimal floor
    if (!Math.floor10) {
        Math.floor10 = function(value, exp) {
            return decimalAdjust('floor', value, exp);
        };
    }
    // Decimal ceil
    if (!Math.ceil10) {
        Math.ceil10 = function(value, exp) {
            return decimalAdjust('ceil', value, exp);
        };
    }
})();

উদাহরণ:

// Round
Math.round10(55.55, -1); // 55.6
Math.round10(55.549, -1); // 55.5
Math.round10(55, 1); // 60
Math.round10(54.9, 1); // 50
Math.round10(-55.55, -1); // -55.5
Math.round10(-55.551, -1); // -55.6
Math.round10(-55, 1); // -50
Math.round10(-55.1, 1); // -60
Math.round10(1.005, -2); // 1.01 -- compare this with Math.round(1.005*100)/100 above
// Floor
Math.floor10(55.59, -1); // 55.5
Math.floor10(59, 1); // 50
Math.floor10(-55.51, -1); // -55.6
Math.floor10(-51, 1); // -60
// Ceil
Math.ceil10(55.51, -1); // 55.6
Math.ceil10(51, 1); // 60
Math.ceil10(-55.59, -1); // -55.5
Math.ceil10(-59, 1); // -50

কেউ এটিকে গিথহাব
জো লিস

নাহ, Math.round10(3544.5249, -2)3544.53 এর পরিবর্তে 3544.52 ফেরায়
মতিজা

2
@ মাতিজা ওল্ফ্রাম আলফা বলেছেন 3544.52। আপনি বর্তমান সংখ্যা এবং বৃত্তাকার সমাপ্তির মধ্যে ত্রুটিটি হ্রাস করতে চান। 3544.52492 দশমিক স্থানের নিকটতম 3544.52সন্নিকরণটি (ত্রুটি = 0.0049)) যদি এটি হয় 3544.53তবে ত্রুটিটি হবে 0.0051। আপনি ক্রমাগত রাউন্ডিং করছেন যেমন ম্যাথ.াউন্ড 10 (ম্যাথ.াউন্ড 10 (3544.5249, -3), -2) যা একটি বৃহত্তর রাউন্ডিং ত্রুটি দেয় এবং এটি পছন্দসই নয়।
ব্যবহারকারী

3
@ মাতিজা, গাণিতিক দৃষ্টিকোণ থেকে 3544.5249 বৃত্তাকার 3544.52, 3544.53 নয়, সুতরাং এই কোডটি সঠিক। আপনি যদি এটি 3544.53 এ গোল করে দেখতে চান এবং এর মতো ক্ষেত্রে (এমনকি শক্তটিও ভুল), এই জাতীয় কিছু করুন:number += 0.00011
বোজিদার সিকানজিক

@ মাতিজা: আমি মনে করি ফাংশনটি যেমনটি করা উচিত ঠিক তেমন কাজ করে। হতে পারে আপনি রাউন্ডিংটির পুনরাবৃত্তি করতে চান যেমন:Math.round10( Math.round10(3544.5249, -3) , -2)
jumxozizi

60

এখানে পাওয়া উত্তরগুলির কোনওটিই সঠিক নয় । @ স্টিঙ্কিচিসম্যান আপনাকে গোল করার অনুরোধ জানিয়েছে , আপনি সকলেই সংখ্যাটি গোল করেছেন।

গোল করার জন্য এটি ব্যবহার করুন:

Math.ceil(num * 100)/100;

15
উদাহরণ ইনপুট এবং আউটপুট দেখায় যে যদিও প্রশ্নটি 'রাউন্ড আপ ...' বলেছিল এটি আসলে 'রাউন্ড টু ...' হওয়ার উদ্দেশ্য ছিল।
জয়ডিএম

2
@ স্টিঙ্কিচিজম্যান একটি নির্দিষ্ট ক্ষেত্রে একটি ত্রুটি দেখিয়েছিলেন, তিনি সিলের মতো সর্বদা গোল করতে চান না, তিনি কেবল 0.005 চেয়ে 0.01-এ গোল করতে চেয়েছিলেন
এমজেগার্ড

9
Math.ceil(1.1 * 100)/100;-টি রিটার্ন পরীক্ষা করার সময় অদ্ভুত বাগ পাওয়া গেছে 1.11, কারণ 1.1 * 100 110.00000000000001ব্র্যান্ডের নতুন আধুনিক ব্রাউজার অনুসারে ফায়ারফক্স, ক্রোম, সাফারি এবং অপেরা ... আইই, পুরানো ফ্যাশনে এখনও চিন্তা করে 1.1*100=1100
skobaljic

1
@ স্পোবালজিক চেষ্টা করুনMath.ceil(num.toFixed(4) * 100) / 100
গাছের পৃষ্ঠ

1
@ ট্রিফেস ফায়ারফক্সেও Math.ceil((1.1).toFixed(4) * 100) / 100ফিরে আসবে 1.11, আধুনিক ব্রাউজারগুলির সমস্যা / বাগটি বহুগুণে রয়েছে এবং লোকেরা এটি সম্পর্কে জানতে হবে (উদাহরণস্বরূপ আমি লটারির খেলায় কাজ করেছি)।
skobaljic

47

এটি করার সহজ উপায় এখানে:

Math.round(value * 100) / 100

আপনার পক্ষে এটি করার জন্য আপনি এগিয়ে যেতে এবং আলাদা ফাংশন করতে চাইতে পারেন:

function roundToTwo(value) {
    return(Math.round(value * 100) / 100);
}

তারপরে আপনি কেবল মানটি পাস করবেন।

আপনি এটি দ্বিতীয় প্যারামিটার যোগ করে দশমিকের যেকোন স্বেচ্ছাসেবী সংখ্যায় গোল করতে উন্নত করতে পারেন।

function myRound(value, places) {
    var multiplier = Math.pow(10, places);

    return (Math.round(value * multiplier) / multiplier);
}

2
এই সমাধান ভুল, দেখতে stackoverflow.com/questions/38322372/... যদি আপনি ইনপুট 156893,145 এবং উপরোক্ত ফাংশন বৃত্তাকার আপনার 156893,14 পরিবর্তে 156893,15 পেতে !!!
saimiris_devel

2
@ সাইমিরিস_দেভেল, আপনি এমন একটি উদাহরণ সন্ধান করতে পেরেছেন যেখানে জাভাস্ক্রিপ্টে সংখ্যার সংখ্যার উপস্থাপনা ব্যর্থ হয়। আপনি সঠিক যে এটি ভুলভাবে গোল করে। তবে - কারণ এটি 100 এর সাথে গুণিতকালে আপনার নমুনা সংখ্যাটি ইতিমধ্যে ভেঙে গেছে (15689314.499999998)। সত্যই, একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত উত্তরের জন্য এমন একটি গ্রন্থাগার প্রয়োজন যা জাভা স্ক্রিপ্টের আসল সংখ্যার পরিচালনা সংক্রান্ত অসঙ্গতিগুলি বিবেচনার জন্য বিশেষভাবে তৈরি করা হয়েছিল। অন্যথায়, আপনি সম্ভবত এই প্রশ্নের উত্তর দেওয়া যে কোনও উত্তর বাতিল করতে পারেন।
জয়ডিএম

36
+(10).toFixed(2); // = 10
+(10.12345).toFixed(2); // = 10.12

(10).toFixed(2); // = 10.00
(10.12345).toFixed(2); // = 10.12

1
আপনি যদি নিজের নম্বরটির স্ট্রিং উপস্থাপনা গ্রহণ করেন এবং এটি গোল করেন তবে এটি সর্বদা একই ফলাফল দেয় না। উদাহরণস্বরূপ +(0.015).toFixed(2) == 0.01,।
মার্ক আমেরি

35

আমার জন্য ম্যাথ.াউন্ড () সঠিক উত্তর দিচ্ছিল না। আমি খুঁজে পেয়েছি ফিক্সড (2) আরও ভাল কাজ করে। নীচে উভয়ের উদাহরণ দেওয়া হল:

console.log(Math.round(43000 / 80000) * 100); // wrong answer

console.log(((43000 / 80000) * 100).toFixed(2)); // correct answer


জেনে রাখা গুরুত্বপূর্ণ যে টু ফিক্সড কোনও বৃত্তাকার সঞ্চালন করে না, এবং সেই ম্যাথ.আউন্ডটি কেবলমাত্র নিকটতম পুরো সংখ্যার জন্য রাউন্ড করে। দশমিকগুলি সংরক্ষণের জন্য আমাদের দশটির শূন্যের সংখ্যা দ্বারা মূল সংখ্যাটি গুণিত করতে হবে যার শূন্যগুলি আপনার কাঙ্ক্ষিত দশমিকের প্রতিনিধিত্ব করে এবং তারপরে ফলাফলটি একই সংখ্যায় ভাগ করে। আপনার ক্ষেত্রে: ম্যাথ.াউন্ড (43000/80000 * 100 * 100) / 100. ফলাফলের ক্ষেত্রে সর্বদা দুটি দশমিক রয়েছে (যেখানে প্রয়োজন সেখানে শূন্যের পিছনে রয়েছে) - নিখুঁতভাবে শেষ পর্যন্ত ফিক্সড (2) প্রয়োগ করা যেতে পারে উল্লম্বভাবে উপস্থাপিত সংখ্যার সিরিজটি ডান সারিবদ্ধ করার জন্য :)
টার্বো

7
.TFFxxed () একটি স্ট্রিং আউটপুট দেয়, একটি সংখ্যা নয় এটিও গুরুত্বপূর্ণ।
carpiediem

2
এটি এখনও রাউন্ডিংয়ের সমাধান করে না 1.005(1.005).toFixed(2)এখনও ফলাফল 1.00
ডিপ্যাক

34

এই ফাংশনটি ব্যবহার করুন Number(x).toFixed(2);


8
এটিকে Numberআবারও মুড়িয়ে দিন , আপনি যদি Number(Number(x).toFixed(2));

5
Numberকল করার প্রয়োজন নেই, x.toFixed(2)কাজ করে।
বিগুসাচ

3
x.toFixed (2) স্ট্রিংটি রিটার্নিং স্ট্রিংয়ের সাথে একটি নম্বর নয়, @bgusach নম্বর কল প্রয়োজন needed আবার সংখ্যায় রূপান্তর করতে আমাদের সংখ্যা দিয়ে মোড়ানো দরকার
মোহন রাম

2
এই পদ্ধতিটি ব্যবহার করার সময় (1).toFixed(2)ফিরে আসে 1.00, তবে এক্ষেত্রে প্রশ্নকর্তার প্রয়োজন 1
ইউজিন মালা

1
এটি কাজ করে না, যখন হওয়া উচিত তখন 1.005.toFixed(2)ফলন হয় । "1""1.01"
অ্যাডাম জাগোস্

33

2017
কেবল নেটিভ কোড ব্যবহার করুন.toFixed()

number = 1.2345;
number.toFixed(2) // "1.23"

আপনার যদি কঠোর হতে হয় এবং প্রয়োজন হয় কেবলমাত্র প্রয়োজন হলে এটি ব্যবহার করতে পারেন replace

number = 1; // "1"
number.toFixed(5).replace(/\.?0*$/g,'');

3
ToFixed পদ্ধতিটি একটি স্ট্রিং প্রদান করে। আপনি যদি কোনও সংখ্যার ফলাফল চান তবে আপনাকে ফিক্সডের ফলাফলটি পার্সফ্লোয়েটে প্রেরণ করতে হবে।
জাম্বোনিলি

@ জাম্বোনিল্লি বা প্রয়োজনে কেবল 1 দ্বারা গুণ করুন। তবে স্থির সংখ্যা বেশিরভাগ ক্ষেত্রে প্রদর্শনের জন্য এবং গণনার স্ট্রিংয়ের জন্য নয় সঠিক ফর্ম্যাট
পেরি মিমন

2
-1; আপনার toFixedবহু বছর আগে একাধিক উত্তর দ্বারা পরামর্শ দেওয়া হয়নি , তবে এটি প্রশ্নের "শুধুমাত্র প্রয়োজনে" শর্তটি পূরণ করতে ব্যর্থ হয়েছে; (1).toFixed(2)প্রশ্নকারী "1.00"যেখানে ইচ্ছা সেখানে দেয় "1"
চিহ্নিত করুন

ঠিক আছে বুঝেছি. আমি সেই মামলার জন্য কিছু সমাধানও যুক্ত করছি
পেরে মিমন

আপনি যদি ল্যাড্যাশ ব্যবহার করছেন তবে এটি আরও সহজ: _.আউন্ড (সংখ্যা, দশমিক স্থান) আমার শেষ মন্তব্যটি মুছে ফেলা হয়েছে, কারণ এতে একটি সমস্যা রয়েছে। যদিও লোডাশ _ পুরো কাজ করে। দশমিক স্থান সহ 1.005 ১.০১ এ রূপান্তর করে।
ডিভিন ক্ষেত্রগুলি

32

এই হালকা ওজনের সমাধানটি ব্যবহার করে দেখুন:

function round(x, digits){
  return parseFloat(x.toFixed(digits))
}

 round(1.222,  2) ;
 // 1.22
 round(1.222, 10) ;
 // 1.222

কেউ কি জানেন যে এই এবং এর মধ্যে কোনও পার্থক্য আছে return Number(x.toFixed(digits))?

1
@ জোআরোক ... যতদূর যাই হোক না কেন .toFixed()কেবল সংখ্যার জন্য মঞ্জুরি দেয় এমন কোনও পরিবর্তন দেখা উচিত নয় ।
পিটারমেসনার

4
এই পৃষ্ঠায় বেশ কয়েকবার উল্লিখিত হিসাবে এই উত্তরটির একই সমস্যা রয়েছে। পরিবর্তে এর round(1.005, 2)ফলাফল দেখুন এবং দেখুন । 11.01
মিলকনডয়িন

রাউন্ডিং আলগো আরও সমস্যা মনে হচ্ছে? - এখানে আরও একাধিক কল্পনা করতে পারবেন: en.wikedia.org/wiki/ রাউন্ডিং ... round(0.995, 2) => 0.99; round(1.006, 2) => 1.01; round(1.005, 2) => 1
পিটারমিইসনার

31

এটি করার বেশ কয়েকটি উপায় রয়েছে। আমার মতো লোকের কাছে লোডাশের রূপ var

function round(number, precision) {
    var pair = (number + 'e').split('e')
    var value = Math.round(pair[0] + 'e' + (+pair[1] + precision))
    pair = (value + 'e').split('e')
    return +(pair[0] + 'e' + (+pair[1] - precision))
}

ব্যবহার:

round(0.015, 2) // 0.02
round(1.005, 2) // 1.01

যদি আপনার প্রকল্প jQuery বা লড্যাশ ব্যবহার করে তবে আপনি roundলাইব্রেরিতে সঠিক পদ্ধতিটিও খুঁজে পেতে পারেন ।

আপডেট 1

আমি ভেরিয়েন্টটি সরিয়েছি n.toFixed(2), কারণ এটি সঠিক নয়। ধন্যবাদ @ হিমবাহ 1


দ্বিতীয় বিকল্পটি ঠিক দুটি দশমিক পয়েন্ট সহ একটি স্ট্রিং প্রদান করবে। প্রশ্নটি প্রয়োজন হলে দশমিক পয়েন্টের জন্য জিজ্ঞাসা করে। এই ক্ষেত্রে প্রথম বিকল্পটি আরও ভাল।
মার্কোস লিমা

@ মারকোসলিমা Number.toFixed()একটি স্ট্রিং ফিরিয়ে দেবে তবে এর আগে একটি প্লাস প্রতীক সহ, জেএস ইন্টারপ্রেটার স্ট্রিংটিকে একটি সংখ্যায় রূপান্তর করবে। এটি একটি সিনট্যাক্স চিনি।
stanleyxu2005

ফায়ারফক্সে, alert((+1234).toFixed(2))"1234.00" দেখায়।
মার্কোস লিমা 14

ফায়ারফক্সে, alert(+1234.toFixed(2))ছুড়ে ফেলে SyntaxError: identifier starts immediately after numeric literal। আমি 1 ম বিকল্পটি দিয়ে থাকি।
মার্কোস লিমা

এটি কিছু প্রান্ত ক্ষেত্রে কাজ করে না: চেষ্টা করুন ( jsfiddle ) এর সাথে 362.42499999999995। প্রত্যাশিত ফলাফল (পিএইচপি হিসাবে echo round(362.42499999999995, 2)): 362.43। আসল ফলাফল:362.42
ডক্টর জিয়ানলুইগি জেন ​​জ্যানেটিনি

26

আপনি যদি লোডাশ লাইব্রেরি ব্যবহার করছেন তবে আপনি নীচের মতো লোড্যাশের বৃত্তাকার পদ্ধতিটি ব্যবহার করতে পারেন।

_.round(number, precision)

উদাহরণ:

_.round(1.7777777, 2) = 1.78

@ পিটার স্ট্যান্ডার্ড জাভাস্ক্রিপ্টের তুলনায় লোডাশ যে কার্যকারিতা সরবরাহ করে তা সত্যিই ভাল। তবে, আমি শুনেছি মানক জেএসের তুলনায় লোডাসের কিছু পারফরম্যান্স সমস্যা রয়েছে। কোডবুর্স্ট.আইও /
মাদুরা প্রদীপ

1
আমি আপনার বক্তব্যটি স্বীকার করি যে লোটাস ব্যবহারের ক্ষেত্রে পারফরম্যান্সের ঘাটতি রয়েছে। আমি মনে করি যে এই বিষয়গুলি অনেক বিমূর্ততার কাছে সাধারণ। তবে এই থ্রেডে কতগুলি উত্তর রয়েছে এবং কীভাবে তদন্তের ক্ষেত্রে স্বজ্ঞাত সমাধানগুলি ব্যর্থ হয় তা কেবল দেখুন। আমরা jQuery সহ এই প্যাটার্নটি দেখেছি এবং যখন ব্রাউজারগুলি একটি সাধারণ স্ট্যান্ডার্ড গ্রহণ করেছিল যা আমাদের বেশিরভাগ ব্যবহারের ক্ষেত্রে সমাধান করে। পারফরম্যান্সের বাধাগুলি ব্রাউজার ইঞ্জিনগুলিতে সরানো হয়েছিল। আমার মনে হয় লোডাশের ক্ষেত্রেও একই ঘটনা ঘটানো উচিত। :)
পিটার

26

ES6 যেহেতু প্রিসিজন ব্যবহার করে এটি করার জন্য একটি 'যথাযথ' উপায় রয়েছে (স্ট্যাটিকগুলি ওভাররাইড না করে এবং কর্মক্ষেত্র তৈরি না করে)

var x = 1.49999999999;
console.log(x.toPrecision(4));
console.log(x.toPrecision(3));
console.log(x.toPrecision(2));

var y = Math.PI;
console.log(y.toPrecision(6));
console.log(y.toPrecision(5));
console.log(y.toPrecision(4));

var z = 222.987654
console.log(z.toPrecision(6));
console.log(z.toPrecision(5));
console.log(z.toPrecision(4));

তাহলে আপনি ন্যায়বিচার করতে পারবেন parseFloatএবং শূন্যরা 'চলে যাবে'।

console.log(parseFloat((1.4999).toPrecision(3)));
console.log(parseFloat((1.005).toPrecision(3)));
console.log(parseFloat((1.0051).toPrecision(3)));

এটি '1.005 রাউন্ডিং সমস্যা' সমাধান করে না - যদিও এটি ভাসমান ভগ্নাংশগুলি কীভাবে প্রক্রিয়াজাত করা হচ্ছে তার অন্তর্ভুক্ত

console.log(1.005 - 0.005);

আপনি যদি গ্রন্থাগারগুলির জন্য উন্মুক্ত থাকেন তবে আপনি bignumber.js ব্যবহার করতে পারেন

console.log(1.005 - 0.005);
console.log(new BigNumber(1.005).minus(0.005));

console.log(new BigNumber(1.005).round(4));
console.log(new BigNumber(1.005).round(3));
console.log(new BigNumber(1.005).round(2));
console.log(new BigNumber(1.005).round(1));
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/2.3.0/bignumber.min.js"></script>


3
(1.005).toPrecision(3)এখনও আসলে 1.00পরিবর্তে ফিরে আসে 1.01
গিয়াকোমো

toPrecisionএকটি স্ট্রিং প্রদান করে যা পছন্দসই আউটপুট ধরণের পরিবর্তন করে।
আদমদুরেন

@ গিয়াকোমো এটি .toPrecisionপদ্ধতির কোনও ত্রুটি নয় , এটি ভাসমান-পয়েন্ট সংখ্যাগুলির একটি নির্দিষ্টতা ( জেএসের সংখ্যাগুলি) - চেষ্টা করুন 1.005 - 0.005, এটি ফিরে আসবে 0.9999999999999999
শাউ-কোট

1
(1).toPrecision(3)'1.00' ফেরত দেয় তবে প্রশ্নকারী 1এই ক্ষেত্রে থাকতে চায় ।
ইউজিন মালা

1
@ গিয়াকোমো যেমন বলেছিলেন, এই উত্তরটি "উল্লেখযোগ্য সংখ্যাগুলি" "বেশ কয়েকটি দশমিক স্থানে গোল করে" দিয়ে বিভ্রান্ত করছে। toPrecisionফর্ম্যাটটি না, পরে না, এবং ওপির প্রশ্নের উত্তর নয়, যদিও এটি প্রথমে প্রাসঙ্গিক বলে মনে হতে পারে এটি অনেক ভুল হয়ে যায়। En.wikedia.org/wiki/Significant_figures দেখুন । উদাহরণস্বরূপ Number(123.4).toPrecision(2)রিটার্ন "1.2e+2"এবং Number(12.345).toPrecision(2)রিটার্ন "12"। আমি @ অ্যাডামডুরেনের এই বক্তব্যের সাথেও একমত হয়েছি যে এটি একটি স্ট্রিং দেয় যা পছন্দনীয় নয় (একটি বিশাল সমস্যা নয় তবে আকাঙ্ক্ষিত নয়)।
নীক

23

মার্কজি এবং ল্যাভামেন্টিস গ্রহণযোগ্যতার চেয়ে আরও ভাল সমাধানের প্রস্তাব দিয়েছিল। এটি আরও লজ্জাজনক বিষয় যে তারা আরও বেশি কিছু না পেয়ে!

এমডিএন এর উপর ভিত্তি করে ভাসমান পয়েন্ট দশমিকের সমস্যাগুলি সমাধান করতে আমি যে ফাংশনটি ব্যবহার করি তা এখানে । এটি লাভামেন্টিসের সমাধানের চেয়ে আরও সাধারণ (তবে কম সংক্ষিপ্ত):

function round(value, exp) {
  if (typeof exp === 'undefined' || +exp === 0)
    return Math.round(value);

  value = +value;
  exp  = +exp;

  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));

  // Shift back
  value = value.toString().split('e');
  return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}

এটি দিয়ে ব্যবহার করুন:

round(10.8034, 2);      // Returns 10.8
round(1.275, 2);        // Returns 1.28
round(1.27499, 2);      // Returns 1.27
round(1.2345678e+2, 2); // Returns 123.46

লাভামেন্টিসের সমাধানের তুলনায় আমরা করতে পারি ...

round(1234.5678, -2); // Returns 1200
round("123.45");      // Returns 123

2
আপনার সমাধান এমডিএন এর সমাধানের বিপরীতে কিছু ক্ষেত্রে কভার করে না। এটি সংক্ষিপ্ত হতে পারে তবে এটি সঠিক নয় ...
এস্তোরিজি

1
গোল (-1835.665,2) => -1835.66
জর্জি

21

এটি আপনাকে সাহায্য করতে পারে:

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

আরও তথ্যের জন্য, আপনি এই লিঙ্কটি একবার দেখতে পারেন

ম্যাথ.াউন্ড (নাম্বার) বনাম num.toFixed (0) এবং ব্রাউজারের অসঙ্গতি


1
কেন বিশ্বজুড়ে গৃহীত উত্তরের উত্তরগুলির তুলনায় এত বেশি ভোট রয়েছে যেহেতু তারা কার্যত একই জিনিস, তবে এইটি গ্রহণযোগ্যটির 1 মিনিট পরে পোস্ট করা হয়েছিল?
উদ্ধৃতি ডেভ

17

সবচেয়ে সহজ পদ্ধিতি হ'ল ফিক্সড ব্যবহার করা এবং তারপরে নম্বর ফাংশনটি ব্যবহার করে ট্রেইলিং শূন্যগুলি ফেলা:

const number = 15.5;
Number(number.toFixed(2)); // 15.5
const number = 1.7777777;
Number(number.toFixed(2)); // 1.78

এটি সব ক্ষেত্রে কার্যকর হয় না। উত্তর পোস্ট করার আগে বিস্তৃত পরীক্ষা করুন।
বাবুরাও

@ বাবুরাও দয়া করে এমন একটি মামলা পোস্ট করুন যাতে উপরের সমাধানটি কাজ করে না
মার্সিন ওনাগো

কনস্ট সংখ্যা = 15; নম্বর (number.toFixed (2)); 15 এর পরিবর্তে //15.00
কেভিন

1
@ কেভিন জাঙ্গিয়ানী কনস্ট নম্বর = 15; নম্বর (number.toFixed (2)); // 15 - আমি এটিকে উভয়টি নতুন ক্রোম এবং ফায়ারফক্সে পরীক্ষা করেছি
ওয়াঙ্গো

@ কেভিন জাঙ্গিয়ানী আপনি কীভাবে পাবেন 15.00? জেএস এর সংখ্যা দশমিক স্থানগুলি সংরক্ষণ করে না এবং যে কোনও প্রদর্শন স্বয়ংক্রিয়ভাবে অতিরিক্ত দশমিক স্থানগুলি ছেঁটে ফেলে (শেষে কোনও শূন্য)।
VLAZ

16
var roundUpto = function(number, upto){
    return Number(number.toFixed(upto));
}
roundUpto(0.1464676, 2);

toFixed(2) এখানে 2 হ'ল অঙ্কের সংখ্যা যা আমরা এই সংখ্যাটি গোল করতে চাই।


এটি। টো ফিক্সড () প্রয়োগ করা আরও সহজ। শুধু একবার এটি মাধ্যমে যান।
রিতেশ ধূরী


14

সহজ রাস্তা:

+num.toFixed(2)

এটি এটিকে একটি স্ট্রিংয়ে রূপান্তর করে এবং তারপরে একটি পূর্ণসংখ্যা / ফ্লোটে ফিরে আসে।


এই সহজ উত্তরের জন্য ধন্যবাদ। তবে, + নম্বরে '+' কী? দশমিক ভাল যেখানে স্ট্রিং এ এসেছিল তা আমার পক্ষে কাজ করেনি। আমি করেছি: (সংখ্যা * 1) .ফিক্সড (2)।
ইথান

@ মোমো যুক্তিটি কেবল ৩ এ পরিবর্তন করুন toFixed()So সুতরাং এটি হবে +num.toFixed(3)। এটি যেভাবে
অনুমান করা হচ্ছে ঠিক সেভাবেই

1
@Edmund এটা 1.01, 1.00 না আসতে অনুমিত এর
MMM

13

এখানে একটি প্রোটোটাইপ পদ্ধতি রয়েছে:

Number.prototype.round = function(places){
    places = Math.pow(10, places); 
    return Math.round(this * places)/places;
}

var yournum = 10.55555;
yournum = yournum.round(2);

13

এই "পার্সফ্লোট (পার্সফ্লোট (মান)। টু ফিক্সড (2))" এর মতো কিছু ব্যবহার করুন

parseFloat(parseFloat("1.7777777").toFixed(2))-->1.78 
parseFloat(parseFloat("10").toFixed(2))-->10 
parseFloat(parseFloat("9.1").toFixed(2))-->9.1

1
ভাসমান উপস্থাপনের ক্ষেত্রে যদি ভুলত্রুটি অন্তর্ভুক্ত না হয় তা নয়। আপনি কেবল এটিকে সরিয়ে ফেলবেন এবং তারপরে আবারও ফ্লোটে রূপান্তর করে একই ত্রুটিটি পুনরায় প্রবর্তন করবেন!
বেন ম্যাকআইন্টির

12

প্রয়োজনীয় হলে কেবল এই জাতীয় রাউন্ডিং অর্জনের একটি উপায় হল নাম্বার.প্রোটোটাইপ.টলোক্যালস্ট্রিং () ব্যবহার করা :

myNumber.toLocaleString('en', {maximumFractionDigits:2, useGrouping:false})

এটি আপনার প্রত্যাশিত আউটপুট সরবরাহ করবে তবে স্ট্রিং হিসাবে। আপনি এখনও সেইগুলিকে সংখ্যায় রূপান্তর করতে পারেন যদি এটি আপনার প্রত্যাশিত ডেটা ধরণের না হয়।


এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার সমাধান যাবতীয় জটিল ভাসমান পয়েন্ট সম্পর্কিত বিষয়গুলি সরিয়ে দেয়, তবে এমডিএন প্রতি সমর্থন এখনও অসম্পূর্ণ - সাফারি এখনও পাস করার যুক্তি সমর্থন করে না toLocaleString
মার্ক অ্যামেরি

@ মার্কআমেরি আপাতত কেবলমাত্র অ্যান্ড্রয়েড ব্রাউজারের কিছু সমস্যা রয়েছে: ক্যানিউজ ডটকম
search=

12

সত্য নির্ভুল দশমিক বৃত্তাকার নির্ভুলতা অর্জনের জন্য সমস্ত সম্ভাব্য উপায়ে বিভিন্ন পুনরাবৃত্তি চালানোর পরে, এটি স্পষ্ট যে সর্বাধিক নির্ভুল এবং দক্ষ সমাধান হ'ল নাম্বার.এপিসিলন ব্যবহার করা। এটি ভাসমান পয়েন্ট গণিতের নির্ভুলতার সমস্যার জন্য একটি সত্য গাণিতিক সমাধান সরবরাহ করে। এখানে প্রদর্শিত হিসাবে এটি সহজেই পলিফিল করা যেতে পারে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / নাম্বার / অ্যাপসিলন বাকি সমস্ত IE ব্যবহারকারীদের সমর্থন করার জন্য (তারপরে আবার সম্ভবত আমরা সম্ভবত এটি করা বন্ধ করা উচিত)।

এখানে সরবরাহিত সমাধান থেকে অভিযোজিত: https://stackoverflow.com/a/48850944/6910392

সমাধানের একটি সরল ড্রপ যা সম্পূর্ণ লাইব্রেরিটি না জুড়ে anচ্ছিক নির্ভুলতা পরিবর্তনশীল সহ সঠিক দশমিক বৃত্তাকার, মেঝে এবং সিলিং সরবরাহ করে।

আপডেট: যেমন সার্জে মন্তব্যগুলিতে উল্লেখ করেছেন, এই (বা যে কোনও) পদ্ধতির সীমাবদ্ধতা রয়েছে যা উল্লেখযোগ্য। 0.0149999999999999999 এর মতো সংখ্যার ক্ষেত্রে, আপনি এখনও অনর্থকতার মুখোমুখি হবেন যা ভাসমান পয়েন্টের মান সঞ্চয়ের জন্য নির্ভুলতার সীমাবদ্ধতার পরম প্রান্তকে আঘাত করার ফলস্বরূপ। এর জন্য অ্যাকাউন্টে প্রয়োগ করা যায় এমন কোনও গণিত বা অন্যান্য সমাধান নেই, কারণ মানটি নিজেই 0.015 হিসাবে মূল্যায়ন করা হয়। আপনি কনসোলে নিজেই সেই মানটি চাওয়ার মাধ্যমে এটি নিশ্চিত করতে পারেন। এই সীমাবদ্ধতার কারণে, এই মানটি হ্রাস করতে স্ট্রিং ম্যানিপুলেশন ব্যবহার করাও সম্ভব হবে না, কারণ এর স্ট্রিং প্রতিনিধিত্ব কেবল "0.015"। এর জন্য অ্যাকাউন্টের যে কোনও সমাধানের জন্য কোনও স্ক্রিপ্টে মানটি গ্রহণের আগে ডেটা উত্সে যৌক্তিকভাবে প্রয়োগ করা দরকার,

var DecimalPrecision = (function(){
        if (Number.EPSILON === undefined) {
            Number.EPSILON = Math.pow(2, -52);
        }
        this.round = function(n, p=2){
            let r = 0.5 * Number.EPSILON * n;
            let o = 1; while(p-- > 0) o *= 10;
            if(n < 0)
                o *= -1;
            return Math.round((n + r) * o) / o;
        }
        this.ceil = function(n, p=2){
            let r = 0.5 * Number.EPSILON * n;
            let o = 1; while(p-- > 0) o *= 10;
            if(n < 0)
                o *= -1;
            return Math.ceil((n + r) * o) / o;
        }
        this.floor = function(n, p=2){
            let r = 0.5 * Number.EPSILON * n;
            let o = 1; while(p-- > 0) o *= 10;
            if(n < 0)
                o *= -1;
            return Math.floor((n + r) * o) / o;
        }
        return this;
    })();
    console.log(DecimalPrecision.round(1.005));
    console.log(DecimalPrecision.ceil(1.005));
    console.log(DecimalPrecision.floor(1.005));
    console.log(DecimalPrecision.round(1.0049999));
    console.log(DecimalPrecision.ceil(1.0049999));
    console.log(DecimalPrecision.floor(1.0049999));
    console.log(DecimalPrecision.round(2.175495134384,7));
    console.log(DecimalPrecision.round(2.1753543549,8));
    console.log(DecimalPrecision.round(2.1755465135353,4));


1
(ডেসিমালপ্রেসিশন.আউন্ড (0.014999999999999999, 2)) // 0.02 ফেরত
সের্গেই

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

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

11

এটি সহজতম, আরও মার্জিত সমাধান (এবং আমি বিশ্বের সেরা;):

function roundToX(num, X) {    
    return +(Math.round(num + "e+"+X)  + "e-"+X);
}
//roundToX(66.66666666,2) => 66.67
//roundToX(10,2) => 10
//roundToX(10.904,2) => 10.9

4
Eস্বরলিপি ব্যবহার করে একটি যুক্তি স্বীকার করার জন্য গৃহীত উত্তরটি পুনরায় লেখার একটি দুর্দান্ত উপায় ।
এক্সেলএইচ

1
এটি কিছু প্রান্তের ক্ষেত্রে কাজ করে না: চেষ্টা করুন ( jsfiddle ) roundToX(362.42499999999995, 2)। প্রত্যাশিত ফলাফল (পিএইচপি হিসাবে echo round(362.42499999999995, 2)): 362.43। আসল ফলাফল:362.42
ডাঃ জিয়ানলুইগি জেন ​​জ্যানেটিনি

6
আইএমএইচও, আপনার পিএইচপি ফলাফল ভুল। তৃতীয় দশমিকের পরে কী আসে যায় তা নয়, তৃতীয় দশমিক 5 এর চেয়ে কম হলে দ্বিতীয় দশমিকটি একই থাকে। এটাই গাণিতিক সংজ্ঞা।
সলডেপ্লাটা সাকেটোস

1
আরও সংক্ষিপ্ত "ই +" হওয়ার পরিবর্তে কেবল "ই" হতে পারে।
লনি সেরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.