जावास्क्रिप्ट में दशमलव संख्याओं को काटें (गोल न करें)


93

मैं दशमलव संख्याओं को दशमलव स्थानों पर कम करने का प्रयास कर रहा हूँ। कुछ इस तरह:

5.467   -> 5.46  
985.943 -> 985.94

toFixed(2)सिर्फ सही काम के बारे में करता है, लेकिन यह मूल्य से दूर है। मुझे राउंड ऑफ वैल्यू की जरूरत नहीं है। आशा है कि जावास्क्रिप्ट में यह संभव है।


6
jQuery सिर्फ एक ढांचा है और आपकी समस्या jQuery से संबंधित नहीं है। यह जावास्क्रिप्ट में कुछ बुनियादी गणना करने के बारे में अधिक है। मुझे आशा है कि आप एक गैर- jQuery समाधान से भी संतुष्ट हैं।
फेलिक्स क्लिंग

मैंने जावास्क्रिप्ट के उपयोग से सिर्फ 2 डेसीमल लौटने के लिए अपनी गणना प्राप्त करने के लिए बहुत अधिक काम पाया। मैं इसके बजाय अपने डेटाबेस दृश्य में आसानी से कर पा रहा था। मुझे पता है कि यह विधि हर स्थिति में फिट नहीं होगी, लेकिन मैं इसे यहां बाहर करना चाहता हूं क्योंकि यह किसी को बहुत समय बचा सकता है।
MsTapp

जवाबों:


51

अद्यतन :

तो, यह सब हो जाने के बाद, गोल कीड़े हमेशा आपको परेशान करेंगे, फिर चाहे आप उन्हें कितना भी मुआवजा दें। इसलिए समस्या को दशमलव संकेतन में बिल्कुल संख्याओं का प्रतिनिधित्व करते हुए हमला किया जाना चाहिए।

Number.prototype.toFixedDown = function(digits) {
    var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"),
        m = this.toString().match(re);
    return m ? parseFloat(m[1]) : this.valueOf();
};

[   5.467.toFixedDown(2),
    985.943.toFixedDown(2),
    17.56.toFixedDown(2),
    (0).toFixedDown(1),
    1.11.toFixedDown(1) + 22];

// [5.46, 985.94, 17.56, 0, 23.1]

दूसरों के संकलन के आधार पर पुरानी त्रुटि-प्रवण समाधान: '

Number.prototype.toFixedDown = function(digits) {
  var n = this - Math.pow(10, -digits)/2;
  n += n / Math.pow(2, 53); // added 1360765523: 17.56.toFixedDown(2) === "17.56"
  return n.toFixed(digits);
}

4
हाँ, प्रोटोटाइप मज़बूती से क्रॉस-ब्राउज़र काम नहीं करते हैं। टाइप सिस्टम के माध्यम से इस (सीमित उद्देश्य) फ़ंक्शन को परिभाषित करने के बजाय, एक तरह से जो मज़बूती से काम नहीं करता है, क्यों न इसे सिर्फ एक पुस्तकालय में रखा जाए।
थॉमस डब्ल्यू

3
इसके अलावा काम नहीं करता है। संख्या 17.56 और अंक = 2 ​​का प्रयास करें। यह 17.56 होना चाहिए, लेकिन यह फ़ंक्शन 17.55 देता है।
shendz

2
इस फ़ंक्शन के साथ दो विसंगतियां: यह फ़ंक्शन एक स्ट्रिंग लौटाता है ताकि इसके बजाय 1.11.toFixedDown(1) + 22समाप्त हो जाए । उत्पादन भी करना चाहिए लेकिन इसके बजाय यह उत्पादन करता है । 1.12223.10.toFixedDown(1)0-0.1
निक नोल्सन

5
ध्यान दें कि यह फ़ंक्शन नकारात्मक चिह्न को हटा देता है। उदाहरण के लिए: (-10.2131).toFixedDown(2) // ==> 10.21
रजगरावाला

4
इसके अलावा, (1e-7).toFixedDown(0) // ==> 1e-7। करता है कि के लिए 1e-(>=7)(पूर्व: 1e-8, 1e-9, ...)।
रजगरावाला

60

डॉगबर्ट का जवाब अच्छा है, लेकिन अगर आपके कोड को नकारात्मक संख्या से निपटना पड़ सकता है, तो Math.floorस्वयं अप्रत्याशित परिणाम दे सकता है।

जैसे Math.floor(4.3) = 4, लेकिनMath.floor(-4.3) = -5

सुसंगत परिणाम प्राप्त करने के लिए इस तरह एक सहायक फ़ंक्शन का उपयोग करें:

truncateDecimals = function (number) {
    return Math[number < 0 ? 'ceil' : 'floor'](number);
};

// Applied to Dogbert's answer:
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100; // = 5.46

यहाँ इस समारोह का एक और अधिक सुविधाजनक संस्करण है:

truncateDecimals = function (number, digits) {
    var multiplier = Math.pow(10, digits),
        adjustedNum = number * multiplier,
        truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);

    return truncatedNum / multiplier;
};

// Usage:
var a = 5.467;
var truncated = truncateDecimals(a, 2); // = 5.46

// Negative digits:
var b = 4235.24;
var truncated = truncateDecimals(b, -2); // = 4200

यदि वह वांछित व्यवहार नहीं है, Math.absतो पहली पंक्ति में कॉल डालें :

var multiplier = Math.pow(10, Math.abs(digits)),

संपादित करें: shendz सही ढंग से बताता है कि इस समाधान का उपयोग a = 17.56गलत तरीके से होगा 17.55। ऐसा क्यों होता है, इसके बारे में अधिक जानने के लिए, फ्लोटिंग-पॉइंट अंकगणित के बारे में हर कंप्यूटर वैज्ञानिक को क्या जानना चाहिए । दुर्भाग्य से, एक समाधान लिखना जो फ्लोटिंग-पॉइंट त्रुटि के सभी स्रोतों को समाप्त करता है, जावास्क्रिप्ट के साथ बहुत मुश्किल है। किसी अन्य भाषा में आप पूर्णांक या शायद दशमलव प्रकार का उपयोग करेंगे, लेकिन जावास्क्रिप्ट के साथ ...

यह समाधान 100% सटीक होना चाहिए , लेकिन यह भी धीमा होगा:

function truncateDecimals (num, digits) {
    var numS = num.toString(),
        decPos = numS.indexOf('.'),
        substrLength = decPos == -1 ? numS.length : 1 + decPos + digits,
        trimmedResult = numS.substr(0, substrLength),
        finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;

    return parseFloat(finalResult);
}

उन लोगों के लिए जिन्हें गति की आवश्यकता है, लेकिन फ़्लोटिंग-पॉइंट त्रुटियों से भी बचना चाहते हैं, BigDecimal.js की तरह कुछ आज़माएं । आप इस SO प्रश्न में अन्य जावास्क्रिप्ट BigDecimal पुस्तकालयों को पा सकते हैं: "क्या एक अच्छी जावास्क्रिप्ट Bigececimal पुस्तकालय है?" और यहाँ जावास्क्रिप्ट के लिए गणित पुस्तकालयों के बारे में एक अच्छा ब्लॉग पोस्ट है


अप्रत्याशित क्यों? 0 से नीचे जाने पर गोलाई की दिशा बदलना, सभी प्रकार के अंकगणितीय कलाकृतियों और भद्दे गणित का कारण बनता है। उदाहरण के लिए, किसी भी अन्य पूर्णांक के रूप में दो बार 0 से अधिक संख्या में गोल होगा। ग्राफिक्स, अकाउंटिंग और कई अन्य उपयोगों के लिए, आपको भद्दे परिणाम मिलेंगे। तुम सच कहता हूं, यह कहने के लिए क्या अपने सुझाव है कठिन हो जाएगा अच्छा के रूप में क्या यह कहने के लिए नहीं
थॉमस डब्ल्यू

यह ठीक है कि यह क्या कहता है के लिए अच्छा है - जब आप गोलाई के बजाय दशमलव को कम करना चाहते हैं।
निक नोल्सन

1
17.56 के साथ काम करने के लिए नहीं जा रहा है क्योंकि ब्राउज़र 17.56 * 100 = 1755.9999999999998 नहीं 1756 देता है
shendz

अच्छी बात shendz मैंने अपने उत्तर को एक समाधान के साथ अद्यतन किया है जो उन लोगों के लिए सभी फ़्लोटिंग-पॉइंट त्रुटि को समाप्त करता है जिनकी आवश्यकता है।
निक नॉल्ससन

1
यदि आप कोई दशमलव नहीं चाहते हैं तो यह उन संख्याओं के लिए काम करेगा, जो 1 से कम हैं - truncateDecimals (-12345, 0) जब तक आप चेक नहीं जोड़ते हैं: if(isNAN(result) result = 0; आप चाहते हैं कि व्यवहार पर निर्भर करता है।
जेरेमी विट्मर

35
var a = 5.467;
var truncated = Math.floor(a * 100) / 100; // = 5.46

5
यह अच्छी तरह से काम करता है लेकिन ऐसे परिणाम देगा जो संभवतः अवांछनीय हैं यदि वह (या बाद में इस जवाब को देखने वाला कोई व्यक्ति) नकारात्मक संख्याओं से निपटता है। देखें stackoverflow.com/a/9232092/224354
निक नॉल्ससन

3
क्यों अवांछनीय है? 0 से नीचे जाने पर गोलाई की दिशा बदलना, सभी प्रकार के अंकगणितीय कारणों का कारण बनता है।
थॉमस डब्ल्यू

8
गोलाई और छंटाई के बीच अंतर है। ट्रंकटिंग स्पष्ट रूप से वह व्यवहार है जो यह प्रश्न चाह रहा है। यदि मैं फोन करता हूं truncate(-3.14)और -4वापस आता हूं, तो मैं निश्चित रूप से उस अवांछनीय फोन को कॉल करूंगा।
निक नोल्सन

मैं थॉमस से सहमत हूं। परिप्रेक्ष्य में अंतर यह हो सकता है कि क्या आप आमतौर पर प्रदर्शन के लिए, या गणना के लिए कम कर रहे हैं। एक कम्प्यूटेशनल परिप्रेक्ष्य से, यह "अंकगणितीय कलाकृतियों" से बचा जाता है

3
var a = 65.1 var truncated = Math.floor(a * 100) / 100; // = 65.09 इसलिए यह एक सही समाधान नहीं है
सनम जैन

22

आप ०.फिक्स के लिए ०.५ घटाकर गोलाई को ठीक कर सकते हैं, जैसे

(f - 0.005).toFixed(2)

1
शीर्षासन करें: जैसा कि यह है कि यह बहुत छोटी संख्याओं, 3 से अधिक दशमलव स्थानों वाली संख्याओं या नकारात्मक संख्याओं के लिए काम नहीं करता है। .0045, 5.4678 और -5.467
निक

यह तब तक काम करेगा जब तक आप उस मूल्य से मेल खाते हैं जो आप उस लंबाई के साथ घटा रहे हैं जो आप चाहते हैं। आप जो कुछ भी पास करते हैं, उसे दशमलव के बाद 0 की संख्या में होना चाहिए।
डेमरा

18

डबल टिल्ड का लाभ लेने~~ पर विचार करें :।

संख्या में लें। दशमलव के बाद महत्वपूर्ण अंकों से गुणा करें ताकि आप के साथ शून्य स्थानों को काट सकें ~~। उस गुणक को वापस विभाजित करें। फायदा।

function truncator(numToTruncate, intDecimalPlaces) {    
    var numPower = Math.pow(10, intDecimalPlaces); // "numPowerConverter" might be better
    return ~~(numToTruncate * numPower)/numPower;
}

मैं ~~कॉल को परेंस में लपेटने का विरोध करने की कोशिश कर रहा हूं ; संचालन के क्रम को उस काम को सही ढंग से करना चाहिए, मुझे विश्वास है।

alert(truncator(5.1231231, 1)); // is 5.1

alert(truncator(-5.73, 1)); // is -5.7

alert(truncator(-5.73, 0)); // is -5

JSFiddle लिंक

संपादित करें: वापस देख रहे हैं, मैंने अनजाने में भी मामलों को संभाल लिया है ताकि दशमलव के बाईं ओर गोल हो सकें।

alert(truncator(4343.123, -2)); // gives 4300.

लॉजिक थोड़ा निराला है जो उस उपयोग की तलाश में है, और एक त्वरित रिफ्लेक्टर से लाभ हो सकता है। लेकिन यह अभी भी काम करता है। अच्छे से बेहतर भाग्यशाली।


यह सबसे अच्छा जवाब है। यदि आप इसके Mathसाथ प्रोटोटाइप का विस्तार करते हैं और निष्पादित करने से पहले NaN-s की जांच करते हैं, तो यह बिल्कुल सही होगा।
बार्टालोमिएज ज़ाल्स्की 15

truncator((10 * 2.9) / 100, 2)0.29 के बजाय 0.28 लौटें ... jsfiddle.net/25tgrzq1
एलेक्स

14

अच्छा एक लाइन समाधान:

function truncate (num, places) {
  return Math.trunc(num * Math.pow(10, places)) / Math.pow(10, places);
}

फिर इसके साथ कॉल करें:

truncate(3.5636232, 2); // returns 3.56
truncate(5.4332312, 3); // returns 5.433
truncate(25.463214, 4); // returns 25.4632

2
मुझे यह समाधान पसंद है, लेकिन बस ध्यान रखें कि यह सभी ब्राउज़रों द्वारा पूरी तरह से समर्थित नहीं है। ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
जीन पार्सलानो

11

मैंने सोचा कि मैं एक उत्तर का उपयोग करके फेंक दूंगा |क्योंकि यह सरल है और अच्छी तरह से काम करता है।

truncate = function(number, places) {
  var shift = Math.pow(10, places);

  return ((number * shift) | 0) / shift;
};

1
अच्छा निर्णय। एक बिटवाइज़ ऑपरेटर का उपयोग करने से एक इंट में मान जमा हो जाता है, और or0 के साथ आईएनजी का अर्थ है "बस जो मैंने पहले ही प्राप्त किया है उसे रखें"। मेरा ~~जवाब क्या करता है, लेकिन एक एकल बिटवाइज़ ऑपरेशन के साथ। हालांकि इसमें भी उतनी ही सीमा है जितनी कि लिखित है: हम 2 ^ 31 से अधिक नहीं जा सकते
रफिन

1
truncate((10 * 2.9) / 100);यह कोड 0.29 jsfiddle.net/9pf0732d के
एलेक्स

@ एलेक्स जैसा कि मैं आपको एहसास करा रहा हूं ... जावास्क्रिप्ट में आपका स्वागत है! । फिक्स हैं। शायद आप एक साझा करना चाहते हैं? : डी
रफिन

@ मुझे इस मुद्दे के बारे में पता है =) मुझे लगा कि यह जवाब इस समस्या का समाधान है। दुर्भाग्य से, मुझे अभी तक एक सटीक समाधान नहीं मिला है, हर जगह इस तरह की समस्या है।
एलेक्स

7

बिटकॉइन संचालकों का उपयोग करना बंद करें:

~~0.5 === 0
~~(-0.5) === 0
~~14.32794823 === 14
~~(-439.93) === -439

यह कैसे काम करता है संदर्भ: stackoverflow.com/questions/7487977/…
जपेली

यह 2 दशमलव स्थानों पर किसी चीज़ को कैसे काटता है?
सलमान A

7

@ डॉगबर्ट के उत्तर के साथ सुधार किया जा सकता है Math.trunc, जो गोलाई के बजाय कम हो जाता है।

गोलाई और छंटाई के बीच अंतर है। ट्रंकटिंग स्पष्ट रूप से वह व्यवहार है जो यह प्रश्न चाह रहा है। यदि मैं ट्रंकट (-3.14) को कॉल करता हूं और -4 वापस प्राप्त करता हूं, तो मैं निश्चित रूप से उस अवांछनीय को कॉल करूंगा। - @NickKnowlson

var a = 5.467;
var truncated = Math.trunc(a * 100) / 100; // = 5.46
var a = -5.467;
var truncated = Math.trunc(a * 100) / 100; // = -5.46

1
यह सभी मामलों में काम नहीं करता है, जैसे कि कंसोल .log (Math.trunc (9.28 * 100) / 100); // 9.27
मैक मच

@MikeMakuch उस के साथ एक समस्या नहीं है Math.trunc, लेकिन बजाय 9.28 * 100है 927.9999बजाय 928। आप फ्लोटिंग प्वाइंट के खतरों
zurfyx

5

मैंने एक छोटी विधि का उपयोग करके उत्तर लिखा। यहां वह है जो मैंने जुटाया

function truncate(value, precision) {
    var step = Math.pow(10, precision || 0);
    var temp = Math.trunc(step * value);

    return temp / step;
}

विधि का उपयोग इस तरह किया जा सकता है

truncate(132456.25456789, 5)); // Output: 132456.25456
truncate(132456.25456789, 3)); // Output: 132456.254
truncate(132456.25456789, 1)); // Output: 132456.2   
truncate(132456.25456789));    // Output: 132456

या, यदि आप एक छोटे वाक्यविन्यास चाहते हैं, तो यहां आप जाएं

function truncate(v, p) {
    var s = Math.pow(10, p || 0);
    return Math.trunc(s * v) / s;
}

यह वह विधि है जिसका मैंने उपयोग करने की अपेक्षा की होगी
टैक्सियन

4
Number.prototype.trim = function(decimals) {
    var s = this.toString();
    var d = s.split(".");
    d[1] = d[1].substring(0, decimals);
    return parseFloat(d.join("."));
}

console.log((5.676).trim(2)); //logs 5.67

मुझे यह पसंद है कि यह स्ट्रिंग्स के साथ काम करता है, इस प्रकार फ्लोटिंग पॉइंट नंबरों की बारीकियों को समाप्त करता है। धन्यवाद!
आईकोड

4

मुझे लगता है कि यह फ़ंक्शन एक सरल समाधान हो सकता है:

function trunc(decimal,n=2){
  let x = decimal + ''; // string 
  return x.lastIndexOf('.')>=0?parseFloat(x.substr(0,x.lastIndexOf('.')+(n+1))):decimal; // You can use indexOf() instead of lastIndexOf()
}

console.log(trunc(-241.31234,2));
console.log(trunc(241.312,5));
console.log(trunc(-241.233));
console.log(trunc(241.2,0));  
console.log(trunc(241));


इसके दो साल बाद पोस्ट किया गया था, लेकिन जब मैं Math.trunc, regex, आदि का उपयोग करके सबसे अच्छा तरीका काम करने की कोशिश कर रहा था, तो मैं इस समाधान को पसंद कर रहा था। मृत सरल लेकिन पूरी तरह से काम करता है (वैसे भी मेरे उपयोग के मामले के लिए)।
गिलेसा १२

हालांकि n = 0 के लिए खाता न भूलें।
जाइल्स १२

3

मुझे एक समस्या मिली: अगली स्थिति पर विचार: 2.1 या 1.2 या -6.4

क्या होगा यदि आप हमेशा 3 डेसीमल या दो या wharever चाहते हैं, तो, आपको दाईं ओर अग्रणी शून्य पूरा करना होगा

// 3 decimals numbers
0.5 => 0.500

// 6 decimals
0.1 => 0.10000

// 4 decimales
-2.1 => -2.1000

// truncate to 3 decimals
3.11568 => 3.115

यह निक नॉल्ससन का निश्चित कार्य है

function truncateDecimals (num, digits) 
{
    var numS = num.toString();
    var decPos = numS.indexOf('.');
    var substrLength = decPos == -1 ? numS.length : 1 + decPos + digits;
    var trimmedResult = numS.substr(0, substrLength);
    var finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;

    // adds leading zeros to the right
    if (decPos != -1){
        var s = trimmedResult+"";
        decPos = s.indexOf('.');
        var decLength = s.length - decPos;

            while (decLength <= digits){
                s = s + "0";
                decPos = s.indexOf('.');
                decLength = s.length - decPos;
                substrLength = decPos == -1 ? s.length : 1 + decPos + digits;
            };
        finalResult = s;
    }
    return finalResult;
};

https://jsfiddle.net/huttn155/7/


x = 0.0000परीक्षण truncateDecimals (x, 2)विफल। लौटता है 0। उम्मीद के 0.00
मुताबिक

3
function toFixed(number, digits) {
    var reg_ex = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)")
    var array = number.toString().match(reg_ex);
    return array ? parseFloat(array[1]) : number.valueOf()
}

var test = 10.123456789
var __fixed = toFixed(test, 6)
console.log(__fixed)
// => 10.123456

3

@Kirilloid द्वारा उत्तर सही उत्तर लगता है, हालाँकि, मुख्य कोड को अपडेट करने की आवश्यकता है। उसका समाधान नकारात्मक संख्याओं का ध्यान नहीं रखता (जो किसी ने टिप्पणी अनुभाग में उल्लेख किया है लेकिन मुख्य कोड में अपडेट नहीं किया गया है)।

अद्यतन करने के लिए एक पूर्ण अंतिम परीक्षण समाधान:

Number.prototype.toFixedDown = function(digits) {
    var re = new RegExp("([-]*\\d+\\.\\d{" + digits + "})(\\d)"),
    m = this.toString().match(re);
    return m ? parseFloat(m[1]) : this.valueOf();
};

नमूना उपयोग:

var x = 3.1415629;
Logger.log(x.toFixedDown(2)); //or use whatever you use to log

फिडल: JS Number राउंड डाउन

पुनश्च: उस समाधान पर टिप्पणी करने के लिए पर्याप्त रेपो नहीं।


2

यहां 2 दशमलव स्थानों तक संख्या को छोटा करने के लिए सरल लेकिन कार्यशील कार्य है।

           function truncateNumber(num) {
                var num1 = "";
                var num2 = "";
                var num1 = num.split('.')[0];
                num2 = num.split('.')[1];
                var decimalNum = num2.substring(0, 2);
                var strNum = num1 +"."+ decimalNum;
                var finalNum = parseFloat(strNum);
                return finalNum;
            }

2

परिणामी प्रकार एक नंबर रहता है ...

/* Return the truncation of n wrt base */
var trunc = function(n, base) {
    n = (n / base) | 0;
    return base * n;
};
var t = trunc(5.467, 0.01);

2

Lodash कुछ गणित उपयोगिता तरीकों है कि कर सकते हैं दौर , फर्श , और प्लस्तर लगाना एक दिया दशमलव परिशुद्धता के लिए एक नंबर। यह पीछे चल रहे शून्य को छोड़ देता है।

वे एक संख्या के प्रतिपादक का उपयोग करके एक दिलचस्प दृष्टिकोण लेते हैं। जाहिरा तौर पर यह गोल मुद्दों से बचा जाता है।

(नोट: funcहै Math.roundया ceilया floorनीचे दिए गए कोड में)

// Shift with exponential notation to avoid floating-point issues.
var pair = (toString(number) + 'e').split('e'),
    value = func(pair[0] + 'e' + (+pair[1] + precision));

pair = (toString(value) + 'e').split('e');
return +(pair[0] + 'e' + (+pair[1] - precision));

स्रोत कोड से लिंक करें


1

यहाँ मेरे विषय पर ले:

convert.truncate = function(value, decimals) {
  decimals = (decimals === undefined ? 0 : decimals);
  return parseFloat((value-(0.5/Math.pow(10, decimals))).toFixed(decimals),10);
};

यह अभी थोड़ा अधिक विस्तृत संस्करण है

(f - 0.005).toFixed(2)

1

जो समाधान के रूप में चिह्नित है वह बेहतर समाधान है जो मुझे आज तक मिला है, लेकिन 0 के साथ एक गंभीर समस्या है (उदाहरण के लिए, 0.toFixedDown (2) -0.01 देता है)। इसलिए मैं इसका उपयोग करने का सुझाव देता हूं:

Number.prototype.toFixedDown = function(digits) {
  if(this == 0) {
    return 0;
  }
  var n = this - Math.pow(10, -digits)/2;
  n += n / Math.pow(2, 53); // added 1360765523: 17.56.toFixedDown(2) === "17.56"
  return n.toFixed(digits);
}

1

यहाँ मेरा उपयोग है:

var t = 1;
for (var i = 0; i < decimalPrecision; i++)
    t = t * 10;

var f = parseFloat(value);
return (Math.floor(f * t)) / t;

1
const TO_FIXED_MAX = 100;

function truncate(number, decimalsPrecison) {
  // make it a string with precision 1e-100
  number = number.toFixed(TO_FIXED_MAX);

  // chop off uneccessary digits
  const dotIndex = number.indexOf('.');
  number = number.substring(0, dotIndex + decimalsPrecison + 1);

  // back to a number data type (app specific)
  return Number.parseFloat(number);
}

// example
truncate(0.00000001999, 8);
0.00000001

के साथ काम करता है:

  • नकारात्मक संख्या
  • बहुत कम संख्या (संख्या। ईपीएसलोन परिशुद्धता)

0

बस मेरे लिए काम करने वाले एक सरल उपाय को इंगित करने के लिए

इसे स्ट्रिंग में परिवर्तित करें और फिर इसे फिर से जोड़ें ...

var number = 123.45678;
var number_s = '' + number;
var number_truncated_s = number_s.match(/\d*\.\d{4}/)[0]
var number_truncated = parseFloat(number_truncated_s)

इसे संक्षिप्त किया जा सकता है

var number_truncated = parseFloat(('' + 123.4568908).match(/\d*\.\d{4}/)[0])

0

यहाँ एक ES6 कोड है जो आप चाहते हैं

const truncateTo = (unRouned, nrOfDecimals = 2) => {
      const parts = String(unRouned).split(".");

      if (parts.length !== 2) {
          // without any decimal part
        return unRouned;
      }

      const newDecimals = parts[1].slice(0, nrOfDecimals),
        newString = `${parts[0]}.${newDecimals}`;

      return Number(newString);
    };

// your examples 

 console.log(truncateTo(5.467)); // ---> 5.46

 console.log(truncateTo(985.943)); // ---> 985.94

// other examples 

 console.log(truncateTo(5)); // ---> 5

 console.log(truncateTo(-5)); // ---> -5

 console.log(truncateTo(-985.943)); // ---> -985.94


0
Number.prototype.truncate = function(places) {
  var shift = Math.pow(10, places);

  return Math.trunc(this * shift) / shift;
};

0

आप तार के साथ काम कर सकते हैं। यह जाँच करता है अगर '।' मौजूद है, और फिर स्ट्रिंग का हिस्सा निकाल देता है।

truncate (7.88, 1) -> 7.8

truncate (7.889, 2) -> 7.89

truncate (-7.88, 1) -> -7.88

function  truncate(number, decimals) {
    const tmp = number + '';
    if (tmp.indexOf('.') > -1) {
        return +tmp.substr(0 , tmp.indexOf('.') + decimals+1 );
    } else {
        return +number
    }
 }

0

मैं थोड़ा उलझन में हूं कि इस तरह के मूल रूप से सरल प्रश्न के इतने अलग-अलग उत्तर क्यों हैं; केवल दो दृष्टिकोण हैं जिन्हें मैंने देखा था जो देखने लायक थे। मैंने https://jsbench.me/ का उपयोग करके गति अंतर को देखने के लिए एक त्वरित बेंचमार्क किया

यह वह समाधान है जो वर्तमान में (9/26/2020) उत्तर के रूप में चिह्नित किया गया है:

function truncate(n, digits) {
    var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"),
        m = n.toString().match(re);
    return m ? parseFloat(m[1]) : n.valueOf();
};

[   truncate(5.467,2),
    truncate(985.943,2),
    truncate(17.56,2),
    truncate(0, 1),
    truncate(1.11, 1) + 22];

हालांकि, यह स्ट्रिंग और रेगेक्स सामान कर रहा है, जो आमतौर पर बहुत कुशल नहीं है, और एक Math.trunc फ़ंक्शन है जो वास्तव में करता है क्या ओपी बस कोई दशमलव के साथ चाहता है। इसलिए, आप आसानी से उसी चीज़ को प्राप्त करने के लिए उस अतिरिक्त अतिरिक्त अंकगणित का उपयोग कर सकते हैं।

यहाँ एक और समाधान है जो मुझे इस धागे पर मिला है, जो कि मैं उपयोग करूंगा:

function truncate(n, digits) {
    var step = Math.pow(10, digits || 0);
    var temp = Math.trunc(step * n);

    return temp / step;
}

[   truncate(5.467,2),
    truncate(985.943,2),
    truncate(17.56,2),
    truncate(0, 1),
    truncate(1.11, 1) + 22];
    

पहली विधि दूसरी की तुलना में "99.92% धीमी" है, इसलिए दूसरी निश्चित रूप से है वह है जिसका मैं उपयोग करने की सलाह ।

ठीक है, काम से बचने के अन्य तरीके खोजने के लिए वापस ...

बेंचमार्क का स्क्रीनशॉट

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