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


298

আমি উদাহরণস্বরূপ বৃত্তাকার প্রয়োজন 6.688689থেকে 6.7, কিন্তু এটা সবসময় আমার দেখায় 7

আমার পদ্ধতি:

Math.round(6.688689);
//or
Math.round(6.688689, 1);
//or 
Math.round(6.688689, 2);

তবে ফলাফল সবসময় একই হয় 7... আমি কী ভুল করছি?



পরীক্ষা করে দেখুন এই
raina77ow

জাভাস্ক্রিপ্টে রাউন্ড নম্বরের নূন্যতম দশকে ডুপ্লিকেট - আপনার নতুন প্রশ্ন জিজ্ঞাসার আগে দয়া করে অনুসন্ধানটি ব্যবহার করুন।
ফেলিক্স ক্লিং


1
পছন্দ করুন তবে, .toFixedএকটি স্ট্রিং প্রদান করে। ফলাফলটি মোড়ানো নিশ্চিত করুন Number()। গৃহীত উত্তর এবং অন্যান্যগুলি দেখুন।
জর্ডান আর্সেনো

উত্তর:


534
Number((6.688689).toFixed(1)); // 6.7

22
একটি সংখ্যাটিকে স্ট্রিংয়ে রূপান্তর করুন এবং তারপরে আবার ফিরে আসবেন? এটা দ্রুত হতে পারে না।
CSL

আপনার সংখ্যার প্রয়োজনের তুলনায় দশমিক কম থাকলে ভাল নয়। এটি কিছু যোগ করেছে
njzk2

2
জেএস বেঞ্চমার্ক শো হিসাবে এটি @ ফাইভডজিট পদ্ধতির চেয়ে ধীর
ফাদোমায়ার

13
Number((456.1235).toFixed(3)) -> 456.123, Number((1.235).toFixed(2)) -> 1.24... মূঢ় JavaSript ...
Noone

6
এটি আপনি যা প্রত্যাশা করছেন তা করতে পারে না! ফলাফল এমনকি ব্রাউজারের উপর নির্ভর করতে পারে, এই প্রশ্নটি দেখুন: stackoverflow.com/q/566564/2224996
মাজা

199
var number = 6.688689;
var roundedNumber = Math.round(number * 10) / 10;

13
এটি সবসময় কাজ করে না। নিন Math.round(1.005*100)/100থেকে উদাহরণস্বরূপ MDN
tybro0103

7
@ tybro0103 ভাসমান পয়েন্ট খারাপ: 1.005 * 100 = 100.49999999999999(কমপক্ষে আমি চেষ্টা করেছি জেএস ইঞ্জিনে)। এ কারণেই এটি কার্যকর হয় না এবং কেন আপনার কখনই পুরোপুরি নির্ভুল হওয়ার উপর নির্ভর করা উচিত নয়।
sudo

1
ভুল। ম্যাথ.াউন্ড (1.015 * 100) / 100 1.02 এর পরিবর্তে 1.01 প্রদান করে
মার্কো

81

toFixed()ফাংশন ব্যবহার করুন ।

(6.688689).toFixed(); // equal to 7
(6.688689).toFixed(1); // equal to 6.7
(6.688689).toFixed(2); // equal to 6.69

5
এটি আপনি যা প্রত্যাশা করছেন তা করতে পারে না! ফলাফল এমনকি ব্রাউজারের উপর নির্ভর করতে পারে, এই প্রশ্নটি দেখুন: stackoverflow.com/q/566564/2224996
মাজা

9
(6.688689) .toFixed (); "7" এর সমান নয় 7. অন্যান্য উদাহরণগুলির জন্য একই।
ভাদো

35

আপডেট (2019-10)। ধন্যবাদ রিস ড্যানিয়েলস নিচের কোড এখন ফাংশন একটি সেট হিসাবে উপলব্ধ npm-প্যাকেজের মধ্যে বস্তাবন্দী প্রত্যাশিত বৃত্তাকার (কটাক্ষপাত)।


আপনি MDN উদাহরণ থেকে সহায়ক ফাংশন ব্যবহার করতে পারেন । এর চেয়ে আপনার আরও নমনীয়তা হবে:

Math.round10(5.25, 0);  // 5
Math.round10(5.25, -1); // 5.3
Math.round10(5.25, -2); // 5.25
Math.round10(5, 0);     // 5
Math.round10(5, -1);    // 5
Math.round10(5, -2);    // 5

আপডেট (2019-01-15)। এমডিএন ডক্সের মতো মনে হচ্ছে আর এই সহায়িকা ফানস নেই। উদাহরণ সহ একটি ব্যাকআপ এখানে দেওয়া হয়েছে:

// 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

2
?? "ম্যাথ.অর্ডার 10 কোনও ফাংশন নয়"
পিটার ক্রাউস

1
আমি এটি অত্যন্ত কার্যকর বলে মনে করেছি এটির অতিরিক্ত কোডটি ফুলে ফেঁপে ছাড়াই এটি ব্যবহার করার জন্য যারা তাদের তাত্ক্ষণিকভাবে একটি এনএমপি প্যাকেজে ঝাঁকুনি দিয়েছিলেন। আসল উত্তরের সাথে ক্রেডিট করেছেন @ এসপঞ্চেঙ্কো: এনপিএমজেএস
ড্যানিয়েলস রিস করুন

19
> +(6.688687).toPrecision(2)
6.7

Numberজাভাস্ক্রিপ্টের একটি অবজেক্টের একটি পদ্ধতি রয়েছে যা আপনার প্রয়োজন মতো ঠিক করে দেয়। সেই পদ্ধতিটি হ'ল Number.toPrecision([precision])

.toFixed(1)এটির মতোই ফলাফলটি একটি স্ট্রিংয়ে রূপান্তরিত করে এবং এটি আবার কোনও সংখ্যায় রূপান্তরিত হওয়া প্রয়োজন। +এখানে উপসর্গটি ব্যবহার করে শেষ হয়েছে।

আমার ল্যাপটপে সহজ বেঞ্চমার্ক:

number = 25.645234 typeof number
50000000 x number.toFixed(1) = 25.6 typeof string / 17527ms
50000000 x +(number.toFixed(1)) = 25.6 typeof number / 23764ms
50000000 x number.toPrecision(3) = 25.6 typeof string / 10100ms
50000000 x +(number.toPrecision(3)) = 25.6 typeof number / 18492ms
50000000 x Math.round(number*10)/10 = 25.6 typeof number / 58ms
string = 25.645234 typeof string
50000000 x Math.round(string*10)/10 = 25.6 typeof number / 7109ms

আমার মতে এটি সর্বোত্তম উত্তর (সেরা অনুশীলনের মেয়াদে সেরা, সর্বাধিক সরল পদ্ধতি)।
সেজার

1
1e-10.toPrecision(3): "1.00e-10" - উল্লেখযোগ্য অঙ্কগুলিতে এই রাউন্ডগুলি ।
ভেসেভলড গোলভানভ

9

আপনি না শুধুমাত্র ব্যবহার করতে চান তাহলে toFixed()কিন্তু ceil()floor()একটি float তারপর আপনি নিম্নলিখিত ফাংশন ব্যবহার করতে পারেন:

function roundUsing(func, number, prec) {
    var tempnumber = number * Math.pow(10, prec);
    tempnumber = func(tempnumber);
    return tempnumber / Math.pow(10, prec);
}

উত্পাদন:

> roundUsing(Math.floor, 0.99999999, 3)
0.999
> roundUsing(Math.ceil, 0.1111111, 3)
0.112

UPD:

অন্য সম্ভাব্য উপায় হ'ল:

Number.prototype.roundUsing = function(func, prec){
    var temp = this * Math.pow(10, prec)
    temp = func(temp);
    return temp / Math.pow(10, prec)
}

উত্পাদন:

> 6.688689.roundUsing(Math.ceil, 1)
6.7
> 6.688689.roundUsing(Math.round, 1)
6.7
> 6.688689.roundUsing(Math.floor, 1)
6.6

তখন আমরা কীভাবে সিল, মেঝে বা বৃত্তাকার জন্য গোল ব্যবহার করব তা সিদ্ধান্ত নেব? উদাহরণস্বরূপ: রাউন্ডউসিং (ম্যাথ.াউন্ড, 1.015, 2) রাউন্ড ইউজিং (ম্যাথ.সিল, 1.015, 2) 2 টি আলাদা মান দেয় আমরা কীভাবে ব্যবহার করব তা আমরা কীভাবে জানি
gaurav5430

7

আমার বর্ধিত বৃত্তাকার ফাংশন:

function round(value, precision) {
  if (Number.isInteger(precision)) {
    var shift = Math.pow(10, precision);
    // Limited preventing decimal issue
    return (Math.round( value * shift + 0.00000000000001 ) / shift);
  } else {
    return Math.round(value);
  }
} 

উদাহরণ আউটপুট:

round(123.688689)     // 123
round(123.688689, 0)  // 123
round(123.688689, 1)  // 123.7
round(123.688689, 2)  // 123.69
round(123.688689, -2) // 100
round(1.015, 2) // 1.02

1
এটি @ পাঁচডিজিটের উত্তরের মতো similar রাউন্ড (1.015, 2) এখনও 1.02 এর পরিবর্তে 1.01 দেয়
গৌরব 5৪৩০

@ গৌরভ ৫৪৩০, আপনার প্রতিবেদনের জন্য ধন্যবাদ, আমি এটি ঠিক করেছি।
নিক সসাই

6

নিচে দেখ

var original = 28.59;

var result=Math.round(original*10)/10 আপনাকে রিটার্ন ফিরিয়ে দেবে 28.6

আশা করি এটি আপনি চান ..


7
"যদি কারওর কাছে মুদ্রা সংরক্ষণের জন্য ফ্লোট ব্যবহার করতে দেখেছি প্রতিবারের জন্য যদি আমার কাছে ডাইম থাকে তবে আমার কাছে $ 999.997634 থাকত" - বিল কারভিন।
এমিক্স

2
ভুল। ম্যাথ.উন্ড (1.015 * 100) / 100
মার্কো


2

আমি মনে করি এই ফাংশনটি সাহায্য করতে পারে।

 function round(value, ndec){
    var n = 10;
    for(var i = 1; i < ndec; i++){
        n *=10;
    }

    if(!ndec || ndec <= 0)
        return Math.round(value);
    else
        return Math.round(value * n) / n;
}


round(2.245, 2) //2.25
round(2.245, 0) //2

কিছু অন্যান্য উত্তরের অনুরূপ, এটি রাউন্ডের জন্য ব্যর্থ (1.015, 2), যা দিতে হবে 1.02
gaurav5430

1

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

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


আপনি কি উত্তর দিতে পারবেন যে এই উত্তরটি ইতিমধ্যে পূর্ববর্তী উত্তরগুলির দ্বারা আবৃত হয়নি?
স্টিলথিথিনেঞ্জ

কিছু অন্যান্য উত্তরের অনুরূপ, এটি রাউন্ডের জন্য ব্যর্থ (1.015, 2), যা দিতে হবে 1.02
gaurav5430


1

বিকল্প আছে। লোকল স্ট্রিং ()লোকাল, গ্রুপিং, কারেন্সি ফর্ম্যাটিং, নোটেশন সম্পর্কিত অনেকগুলি বিকল্প সহ সংখ্যার ফর্ম্যাট । কিছু উদাহরণ:

1 দশমিক রাউন্ডে, একটি ভাসা ফেরত:

const n = +6.688689.toLocaleString('fullwide', {maximumFractionDigits:1})
console.log(
  n, typeof n
)

রাউন্ড 2 ডেসিমাল, নির্দিষ্ট চিহ্ন সহ মুদ্রা হিসাবে ফর্ম্যাট , হাজার হাজারের জন্য কমা গোষ্ঠীকরণ ব্যবহার করুন:

console.log(
  68766.688689.toLocaleString('fullwide', {maximumFractionDigits:2, style:'currency', currency:'USD', useGrouping:true})   
)

স্থানীয় মুদ্রা হিসাবে ফর্ম্যাট করুন :

console.log(
  68766.688689.toLocaleString('fr-FR', {maximumFractionDigits:2, style:'currency', currency:'EUR'})   
)

সর্বনিম্ন 3 দশমিক রাউন্ড, জিরোগুলি প্রদর্শন করতে বাধ্য করুন:

console.log(
  6.000000.toLocaleString('fullwide', {minimumFractionDigits:3})
)

অনুপাতের জন্য শতকরা শৈলী। % চিহ্ন সহ * 100 ইনপুট দিন

console.log(
  6.688689.toLocaleString('fullwide', {maximumFractionDigits:2, style:'percent'})
)



1

টু ফিক্সড () যদি কাজ না করে তবে আমার খুব ভাল সমাধান রয়েছে।

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

উদাহরণ

roundOff(10.456,2) //output 10.46

আন্ডাররেটেড সমাধান। এটি কাজ করে
সাইমন পিএ


0

সামান্য খামচি এই উত্তর :

function roundToStep(value, stepParam) {
   var step = stepParam || 1.0;
   var inv = 1.0 / step;
   return Math.round(value * inv) / inv;
}

roundToStep(2.55, 0.1) = 2.6
roundToStep(2.55, 0.01) = 2.55
roundToStep(2, 0.01) = 2

রাউন্ডটোস্টেপ (1.015, 0.002) 1.014 দেয়। এটি কি এটি সঠিকভাবে ব্যবহার করা যায়
gaurav5430

@ গৌরভ ৫৪৩০ চেষ্টা করুনroundToStep(1.015, 0.001)
ক্র্যাশলোট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.