জাভাস্ক্রিপ্টে কোনও সংখ্যা কীভাবে গোল করবেন?


159

আমি জাভাস্ক্রিপ্ট ব্যবহার করতে চাই একটি সংখ্যার বৃত্তাকার। যেহেতু সংখ্যাটি মুদ্রা, তাই আমি চাই যে এটি উদাহরণগুলির মধ্যে (2 দশমিক পয়েন্ট) এর মতো হবে:

  • 192.168 => 192.20
  • 192.11 => 192.20
  • 192.21 => 192.30
  • 192.26 => 192.30
  • 192.20 => 192.20

জাভাস্ক্রিপ্ট ব্যবহার করে এটি কীভাবে অর্জন করবেন? অন্তর্নিহিত জাভাস্ক্রিপ্ট ফাংশনটি স্ট্যান্ডার্ড লজিকের উপর ভিত্তি করে সংখ্যাটি বাড়িয়ে তুলবে (আরও কম করে 5 এর বেশি হবে)।

উত্তর:


313
/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=> 192.2

2
@ অ্যান্ড্রুমারশাল 10 এর সাথে ভাগ করে তার গুণকটির উদ্দেশ্য কী?
কোডেকবয়

6
@ কোডকোবয় আপনি যদি না করেন তবে তা ceil()আপনাকে দেবে 193, সুতরাং আমাদের অবশ্যই নিশ্চিত করতে হবে যে আমরা যে যথাযথতা রাখতে চাই তা দশমিক বিন্দুর আগে। তারপরে আমরা "আসল" মানটি পুনরুদ্ধার করতে বিপরীত ক্রিয়াকলাপটি করি।
অ্যান্ড্রু মার্শাল

1
তোমার মত কিছু নম্বর পেতে হলে 192.19999999999997, আপনি আবেদন করতে পারেন .toFixed(1)থেকেnum
flamer.ohr

4
এবং এখানে যারা ভাবছেন যে কীভাবে নিকটস্থ পুরো সংখ্যার সাথে সংযুক্ত করা যায়, আপনার কেবল ম্যাথ.সিল () দরকার। বাকিটি দশমিকের সাথে ডিল করার জন্য। অন্যদের সময়টি বাঁচাতে আমার মস্তিষ্ককে এটি পেতে সময় লাগল!
নাইজেল বি পেক

এই সমাধানটিতে বাগ রয়েছে: ম্যাথ.সিল (0.0159 * 1000000000) / নির্ভুলতা। আপনি একটি ভগ্নাংশ 0.015900001 পাবেন। নির্ভুলতার জন্য একটি পরিসীমা বৈধতা যুক্ত করা দরকার।
ফ্রাঙ্ক

26

কিছুটা দেরি হলেও, এই উদ্দেশ্যে একটি পুনরায় ব্যবহারযোগ্য জাভাস্ক্রিপ্ট ফাংশন তৈরি করতে পারে:

// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

হিসাবে ফাংশন কল করুন

alert(roundNumber(192.168,2));

2
এটি দুর্দান্ত কাজ করে, তবে ওপি জিজ্ঞাসা করেছিল যে কীভাবে একটি সংখ্যা বাড়ানো যায়, সুতরাং ম্যাথ.গ্রাউন্ডের পরিবর্তে এখানে ম্যাথ.সিল ব্যবহার করা উচিত।
kloddant

আপনি যে দশমিক জায়গার জন্য লক্ষ্য রেখেছেন তা সত্ত্বেও আপনি যদি সঠিকভাবে গোল করে দেখতে চান তবে এই উত্তর গৃহীত উত্তরের চেয়ে ভাল। উদাহরণস্বরূপ: 1.054 -> 1.05 1.055 -> 1.06 তবে এখানে একটি প্রান্তের মামলা: 1.005 -> 1 1.006 -> 1.01 এবং 1.015 -> 1.01 1.016 -> 1.02 তাই সাবধান হন।
জে কে

21

একটি সাধারণ ঝাঁকুনি দিয়ে সাধারণ রাউন্ডিং কাজ করবে:

Math.round(price * 10)/10

এবং আপনি যদি কোনও মুদ্রার ফর্ম্যাট রাখতে চান তবে আপনি নম্বর পদ্ধতিটি ব্যবহার করতে পারেন .toFixed()

(Math.round(price * 10)/10).toFixed(2)

যদিও এটি এটিকে একটি স্ট্রিং তৈরি করবে =)


ম্যাথ.উইন্ড (192.11 * 100) / 100 -> 192.11
krtek

1
দ্বিতীয়টির কোনও গোল করার দরকার নেই, এটি আরও ভালোprice.toFixed(2)
মাইকেল ক্রেলিন - হ্যাকার

@ ক্রেটেক ওপস, এটি ধরার জন্য ধন্যবাদ আমি প্রশ্নটি ভুলভাবে পড়েছি। উত্তর আপডেট হয়েছে।
শাদ

2
ওপি জিজ্ঞাসা করেছিল কীভাবে কোনও সংখ্যার বৃত্তাকারী করা যায়, সুতরাং ম্যাথ.গ্রাউন্ডের পরিবর্তে ম্যাথ.সিল ব্যবহার করা উচিত।
kloddant

10

থাই উত্তরটির খুব কাছে , তবে আমি এটির কাজ করার জন্য একটি সামান্য জিনিস পরিবর্তন করেছি:

var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );


2

ওপি দুটি জিনিস প্রত্যাশা করে:
এ। দশমিক দশম
স্থানে শূন্য প্রদর্শন করতে (মুদ্রার সাথে একটি সাধারণ প্রয়োজন) B.

উভয় প্রয়োজনীয়তা মিলে উপরের প্রতিটিটির জন্য পৃথক পদ্ধতি প্রয়োজন বলে মনে হচ্ছে। সুর্যাকিরণের প্রস্তাবিত উত্তরের উপর ভিত্তি করে এমন একটি পদ্ধতি এখানে দেওয়া হয়েছে:

//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60

গুরুত্বপূর্ণ দ্রষ্টব্য: এই সমাধানটি নেতিবাচক এবং ঘাতক সংখ্যাগুলির সাথে একটি খুব আলাদা ফলাফল উত্পন্ন করে।

এই উত্তর এবং দুটি যে খুব মিল অনুরূপ মধ্যে তুলনা করার জন্য, নিম্নলিখিত 2 পদ্ধতির দেখুন। প্রথমটি সর্বদা স্বাভাবিকের নিকটতম শততমের জন্য, এবং দ্বিতীয়টি কেবলমাত্র নিকটতম শততম (বৃহত্তর) পর্যন্ত বৃত্তাকার হয়।

function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92

2

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

function roundIt(num, precision) {
    var rounder = Math.pow(10, precision);
    return (Math.round(num * rounder) / rounder).toFixed(precision)
};

এ জাতীয় সব কিছু একসাথে রেখে দেয়। ম্যাথ.সাউন্ড () ম্যাথ.সিল () এর সাথে রাউন্ড-অফের পরিবর্তে রাউন্ড-আপ করুন, যা ওপি চেয়েছিল।


1

রাউন্ড নম্বর ছাড়াই এই ফাংশন সীমা দশমিক

function limitDecimal(num,decimal){
     return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}

সংক্ষিপ্ত বিকল্প হিসাবে: রিটার্ন ('' + সংখ্যা) .স্প্লিট ('।')। শিফট ()
রবার্তো

ধন্যবাদ রবার্তো এই কোডটি কাজ করে তবে সমস্ত দশমিক সরিয়ে ফেলুন
বাহনাম মোহাম্মদী

0

আমি দীর্ঘদিন ধরে @ অ্যান্ড্রুমার্শাল উত্তরটি ব্যবহার করছি, তবে কয়েকটি প্রান্তের কেস পেয়েছি। নিম্নলিখিত পরীক্ষাগুলি পাস করে না:

equals(roundUp(9.69545, 4), 9.6955);
equals(roundUp(37.760000000000005, 4), 37.76);
equals(roundUp(5.83333333, 4), 5.8333);

আমি এখন সঠিকভাবে আচরণ করার জন্য যা ব্যবহার করি তা এখানে:

// Closure
(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;
    }
    // If the value is negative...
    if (value < 0) {
      return -decimalAdjust(type, -value, exp);
    }
    // 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
Math.round10(-1.005, -2);  // -1.01
// 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

সূত্র: https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / ম্যাথ / গ্রাউন্ড


1
আপনার পরীক্ষার কেসগুলি ভুল বলে মনে হচ্ছে। roundUp(37.760000000000005, 4)হওয়া উচিত 37.7601, এবং roundUp(5.83333333, 4)হওয়া উচিত 5.8334। এই দুটি (এবং আপনার প্রথম) সমস্ত আমার দেওয়া fn এর জন্য সত্য।
অ্যান্ড্রু মার্শাল

@ অ্যান্ড্রুমারশালের কারণ আছে, 2 এবং 3 কেসের জন্য আপনার প্রত্যাশিত মানগুলি ভুল
আম্ন

-3

পার্সি এটা সবসময়ই ঘোরে .....

console.log(parseInt(5.8)+1);

do parseInt () + 1

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