जावास्क्रिप्ट में एक संख्या को गोल कैसे करें?


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
@AndrewMarshall क्या गुणा करने का उद्देश्य है, फिर 10 से विभाजित करना?
codecowboy

6
@codecowboy आप नहीं करते हैं, तो ceil()आप दे देंगे 193, तो हम यह सुनिश्चित करना चाहिए कि सभी परिशुद्धता हम रखना चाहते दशमलव बिंदु से पहले है। फिर हम "मूल" मान को पुनर्स्थापित करने के लिए उलटा ऑपरेशन करते हैं।
एंड्रयू मार्शल

1
आप जैसे कुछ नंबर मिलता है 192.19999999999997, तो आप आवेदन कर सकते हैं .toFixed(1)करने के लिएnum
flamer.ohr

4
और यहाँ उन लोगों के लिए जो निकटतम WHOLE नंबर तक राउंड करने के लिए सोच रहे हैं, आपको बस Math.ceil () की आवश्यकता है। बाकी सिर्फ दशमलव से निपटने के लिए है। दूसरों को बचाने के लिए उस समय मेरे दिमाग में लग गया!
निगेल बी। पेक

इस समाधान में बग है: Math.ceil (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
यह बहुत अच्छा काम करता है, लेकिन ओपी ने पूछा कि एक नंबर को कैसे राउंड किया जाए, इसलिए Math.ceil का उपयोग Math.round के बजाय यहाँ किया जाना चाहिए।
kloddant

यदि आप जिस दशमलव स्थान के लिए लक्ष्य कर रहे हैं, उसके बावजूद यह उत्तर स्वीकृत उत्तर से बेहतर है। Ex: 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)
माइकल क्रेलिन - हैकर

@Krtek ooops, कि पकड़ने के लिए धन्यवाद। मैंने प्रश्न को गलत पढ़ा। उत्तर अपडेट किया गया।
शाद

2
ओपी ने पूछा कि एक नंबर कैसे राउंड किया जाए, इसलिए Math.ceil का उपयोग Math.round के बजाय यहां किया जाना चाहिए।
kloddant


2

ओपी को दो चीजों की उम्मीद है:
ए दसवें स्थान पर चक्कर लगाने के लिए, और
बी को सौवें स्थान पर एक शून्य दिखाने के लिए (मुद्रा के साथ एक विशिष्ट आवश्यकता)।

उपरोक्त दोनों में से प्रत्येक के लिए एक अलग विधि की आवश्यकता प्रतीत होती है। यहाँ एक दृष्टिकोण है जो सुर्यकिरण के सुझाए गए उत्तर पर बनाता है:

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

ठीक है, यह उत्तर दिया गया है, लेकिन मैंने सोचा कि आप मेरे उत्तर को देखना पसंद कर सकते हैं जो एक बार math.pow () फ़ंक्शन को कॉल करता है। मुझे लगता है कि मैं चीजों को रखना पसंद करता हूं DRY।

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

यह सभी को एक साथ रखता है। Math.ceil () को Math.ceil () के साथ राउंड-अप के बजाय राउंड-अप में बदलें, जो कि ओपी चाहता था।


1

यह फ़ंक्शन गोल संख्या के बिना दशमलव को सीमित करता है

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

छोटे विकल्प के रूप में: वापसी ('' + num)। Split ('।') 'Shift' ()
रॉबर्टो

धन्यवाद रॉबर्टो इस कोड काम करते हैं, लेकिन
बेहनाम मोहम्मदी

0

मैं लंबे समय से @AndrewMarshall उत्तर का उपयोग कर रहा हूं, लेकिन कुछ किनारे मामले पाए गए। निम्नलिखित परीक्षण पास नहीं हैं:

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/Reference/Global_Objects/Math/round


1
आपके परीक्षण के मामले गलत लगते हैं। roundUp(37.760000000000005, 4)होना चाहिए 37.7601, और roundUp(5.83333333, 4)होना चाहिए 5.8334। ये दोनों (और आपका पहला) सभी मेरे द्वारा दिए गए fn के लिए सही हैं।
एंड्रयू मार्शल

@AndrewMarshall कारण है, अपने अपेक्षित मानों मामले में 2 और 3 के लिए गलत हैं
Amn

-3

ParseInt हमेशा नीचे राउंड सो ...

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

do parseInt () + 1

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.