जावास्क्रिप्ट: एक गोल संख्या को N दशमलव तक प्रारूपित करना


104

जावास्क्रिप्ट में, एन दशमलव स्थानों के लिए एक संख्या को गोल करने का विशिष्ट तरीका कुछ इस प्रकार है:

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

हालाँकि यह दृष्टिकोण अधिकतम N दशमलव स्थानों पर होगा, जबकि मैं हमेशा N दशमलव स्थानों पर घूमना चाहता हूँ । उदाहरण के लिए "2.0" को "2" तक गोल किया जाएगा।

कोई विचार?


9
आम तौर पर, आप toFixed()( developer.mozilla.org/En/Core_JavaScript_1.5_Reference/… ) का उपयोग कर सकते हैं , लेकिन यह IE में छोटी गाड़ी है: stackoverflow.com/questions/661562/… ; आपको अपना स्वयं का संस्करण लिखना होगा ...
क्रिस्टोफ

1
@होजू - शायद स्वीकार किए गए उत्तर को बदल दें - डेविड का जवाब IE8 + के लिए सही है, जबकि स्वीकृत उत्तर में सभी ब्राउज़रों पर कुछ गंभीर कीड़े हैं।
रोबोकट

@robocat: क्या आप गंभीर हैं?
गुफा

जवाबों:


25

यह एक गोलमटोल नहीं है, यह एक प्रदर्शन समस्या है। एक संख्या में महत्वपूर्ण अंकों के बारे में जानकारी नहीं होती है; मान 2 2.0000000000000 के समान है। यह तब होता है जब आप गोल मान को एक स्ट्रिंग में बदल देते हैं जो आपने इसे एक निश्चित संख्या में प्रदर्शित करता है।

आप बस संख्या के बाद शून्य जोड़ सकते हैं, जैसे कुछ:

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

(ध्यान दें कि यह मानता है कि क्लाइंट की क्षेत्रीय सेटिंग्स दशमलव विभाजक के रूप में अवधि का उपयोग करती हैं, कोड को अपनी सेटिंग्स के लिए काम करने के लिए कुछ और काम की आवश्यकता होती है।)


3
toFixed छोटी गाड़ी है। उदाहरण के लिए दशमलव: 1.02449999998 अगर u do dec.toFixed (4) => 1.0244 है। इसकी जगह 1.0245 होनी चाहिए थी।
बैट_प्रोग्रामर

2
@deepeshk लेकिन toFixed()राउंडिंग के बाद आखिर में पैड डेसीमल के इस्तेमाल से क्या समस्या होगी ?
पलोया

10
क्या ब्राउज़र में @deepeshk? बस इसे क्रोम 17 में आज़माया और 1.02449999998.toFixed(4)सही ढंग से रिटर्न 1.0245
मैट बॉल

3
@ मार्कटोमलिन: तब ऐसा लगता है कि आपके पास संख्या के बजाय एक स्ट्रिंग है।
गुफ़ा

1
.toFixed () आधुनिक ब्राउज़रों में शानदार ढंग से काम करता है (मैंने क्रोम, फ़ायरफ़ॉक्स, IE11, IE8 का परीक्षण किया)। @Bat_Programmer - कृपया स्पष्ट करें कि आपके अनुसार कौन से ब्राउज़र में यह बग है।
रोबोकट

243

मुझे लगता है कि यहां दिए गए सभी के लिए एक अधिक सरल दृष्टिकोण है, और यह Number.toFixed()पहले से ही जावास्क्रिप्ट में लागू की गई विधि है ।

बस लिखें:

var myNumber = 2;

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

आदि...


कहाँ बताया गया है, होज़ू? मैंने अन्य उत्तरों की समीक्षा की और मुझे यह पता नहीं चला कि किसी को भी सूचित किया जाता है कि फंक्शन फंक्शन छोटी गाड़ी है। धन्यवाद
डेविड

@ डेविड: इसका उत्तर के लिए एक टिप्पणी में उल्लेख किया गया है।
गुफ़ा

13
सावधानी: toFixed()एक स्ट्रिंग लौटाता है।
जॉर्डन आर्सेनो

2
@JordanArseno यह parseInt (myNumber.toFixed (intVar)) का उपयोग करके तय किया जा सकता है; पूर्णांक मान, या parseFloat (myNumber.toFixed (floatVar)) वापस करने के लिए; यदि उपयोगकर्ता के पास दशमलव स्थान हैं, तो एक फ्लोट वापस करने के लिए।
स्टीफन रोमेरो

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" को शामिल करने के लिए उत्सुक हैं, तो यहां एक सरणी कंस्ट्रक्टर का उपयोग करके किसी वर्ण को दोहराने का विवरण पढ़ें ।


.3०.3.३३३३३३३३३३३३३ के मान में or० ..०० के रिटर्न वैल्यू में २ या ३ परिणाम के साथ पास होना। मुझे 2 दशमलव स्थानों के लिए इसकी आवश्यकता है, क्रोम और IE 9 में .toFixed (2) मेरी आवश्यकताओं को पूरा करता है।
एलन सेप

यह एक सामान्य तरीका नहीं है, उदाहरण के लिए, (16.775, 2) रिटर्न 16.77। संख्या को स्ट्रिंग में कनवर्ट करें फिर कनवर्ट करना एकमात्र तरीका है।
हाईवे

2
इस पद्धति के साथ एक बग है: toFixed (-0.1111, 2) रिटर्न 0.11 है, अर्थात नकारात्मक चिन्ह खो गया है।
मैट

महान काम करता है, सिवाय इसके कि मैंने अंत में parseFloat (परिणाम) जोड़ा है। एक संपादन लायक।
अर्तूर बरसेघन

16

हमेशा चीजों को करने का एक बेहतर तरीका है।

var number = 51.93999999999761;

मैं चार अंक प्राप्त करना चाहूंगा: 51.94

बस करो:

number.toPrecision(4);

परिणाम होगा: 51.94


2
और अगर आप 100 जोड़ते हैं तो क्या होगा? क्या आपको इसे बदलकर नंबर.टाइप (5) करने की आवश्यकता है?
जॉनीबिजल

2
हाँ। ३१.९ ३ ९ ३ )३.टूपीप्रिटेशन (४)> "३१.९ ४" / १३१.९ ३ ९ ३..तोप्रिशिष्ट (४)> "१३१.९"
रेपसेन

6

PHP- तरह गोलाई विधि

नीचे दिए गए कोड का उपयोग अपने स्वयं के नामस्थानों के लिए Math.round के अपने स्वयं के संस्करण को जोड़ने के लिए किया जा सकता है जो एक सटीक पैरामीटर लेता है। ऊपर के उदाहरण में दशमलव गोलाई के विपरीत, यह तार से और उसके लिए कोई रूपांतरण नहीं करता है, और सटीक पैरामीटर PHP और एक्सेल के समान काम करता है जिससे एक सकारात्मक 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

Math.round के लिए मोज़िला डेवलपर संदर्भ से ()


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;
}

आपके कोड में एक बग है। मैंने toFixed (2.01, 4) की कोशिश की और "2.100" का परिणाम मिला। अगर मुझे कभी इसे ठीक करने का तरीका मिल जाए, तो मैं इस प्रश्न के उत्तर के रूप में पोस्ट करूँगा।
एलियास ज़मरिया

@ mikez302: गद्दी गणना एक से बंद थी; अब काम करना चाहिए, लेकिन अगर यह अभी भी टूट गया है तो मुझे फिर से बग मुक्त करने के लिए स्वतंत्र महसूस करें ...
क्रिस्टोफ

बहुत अजीब। जब मैं फायरबुक 17 में फायरबग कंसोल ओपन के साथ इस फिशन को चलाता हूं तो यह पूरे ब्राउजर को फ्रीज कर देता है जैसे js एक अंतहीन लूप में फंस जाता है। भले ही मैं उत्पादन को सांत्वना नहीं देता। अगर मेरे पास फायरबग सक्रिय नहीं है तो बग उत्पन्न नहीं होता है।
सबलीमरिक

1
अपडेट, मैंने इसे क्रोम में चलाया और मुझे मिलता है: अनकॉन्डेड रेंजर्र: अधिकतम कॉल स्टैक का आकार, फ़ंक्शन फ़ंक्शन कॉल के संबंध में अधिक हो गया।
सबलीमेरिक

@SublymeRick: मुझे नहीं पता कि ऐसा क्यों होता है; अंधेरे में गोली मार दी: समारोह का नाम बदलने की कोशिश ...
क्रिस्टोफ

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

यह एन अंकों के चक्कर लगाने के लिए काम करता है (यदि आप केवल एन अंकों को कम करना चाहते हैं तो Math.round कॉल को हटा दें और Math.trunc one का उपयोग करें):

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

जब मैं डेटा हेरफेर ई-स्लेट घटकों को संलेखन कर रहा था तो अतीत में जावा पर इस तरह के तर्क का सहारा लेना पड़ा था । जब से मुझे पता चला था कि 0 में कई बार 0 जोड़कर आप कुछ अनपेक्षित रूप से लंबे दशमलव भाग के साथ समाप्त हो जाएंगे (यह फ्लोटिंग पॉइंट अंकगणित के कारण है)।

हमेशा 2 दशमलव स्थानों को दिखाने के लिए प्रारूप संख्या पर एक उपयोगकर्ता टिप्पणी इस तकनीक को स्केलिंग कहती है।

कुछ उल्लेख ऐसे मामले हैं जो अपेक्षित रूप से गोल नहीं करते हैं और http://www.jacklmoore.com/notes/rounding-in-javascript/ पर इसके बजाय सुझाव दिया गया है:

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

btw, POSITS भविष्य के लिए वादा कर रहे हैं h / w आर्किटेक्चर: nextplatform.com/2019/07/08/…
जॉर्ज Birbilis

-2

यदि आप वास्तव में गोलाई के बारे में परवाह नहीं करते हैं, तो बस एक toFixed (x) को जोड़ा और फिर यदि आवश्यक हो तो 0es और dot को पीछे हटा दिया। यह कोई तेज़ उपाय नहीं है।

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
एलियास ज़मरिया

क्षमा करें @EliasZamaria, यह पहली बार में समझ में नहीं आया। मैंने पोस्ट को एडिट किया है। बस ध्यान दें कि मान के अपरिभाषित होने पर यह "0.0000" लौटा देता है।
जुआन कैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.