मैं जावास्क्रिप्ट में एक संख्या को कैसे गोल कर सकता हूं? .toFixed () एक स्ट्रिंग लौटाता है?


176

क्या मुझसे कोई चूक हो रही है?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

क्यों करता है.toFixed()एक स्ट्रिंग वापसी?

मैं संख्या को 2 दशमलव अंकों में गोल करना चाहता हूं।


7
क्योंकि यह एक स्ट्रिंग वापस करने के लिए डिज़ाइन किया गया है?
19

2
मेरे लिए यह सिर्फ अजीब लगता है। .toFixed () केवल संख्याओं पर काम करता है ... सही है?
डेरेक अडायर

10
मैं समझता हूं कि Math.round () उम्मीद के मुताबिक काम करता है। मैं अभी पूछताछ कर रहा था कि संख्याओं पर काम करने वाला एक फ़ंक्शन एक स्ट्रिंग क्यों लौटाता है ...
डेरेक एडेयर

3
2017 में रहने वाले लोगों को लॉज का
Yves M.

1
ऐसा करता है _। गिनती? अभी तक उनके भाई के लिए उन्नत नहीं है।
जेना लीफ

जवाबों:


124

यह एक स्ट्रिंग लौटाता है क्योंकि 0.1, और इसकी शक्तियां (जिसका उपयोग दशमलव अंशों को प्रदर्शित करने के लिए किया जाता है), बाइनरी फ्लोटिंग-पॉइंट सिस्टम में प्रतिनिधित्व योग्य (कम से कम पूरी सटीकता के साथ नहीं) हैं।

उदाहरण के लिए, 0.1 वास्तव में 0.1000000000000000055511151231257827021181583404541415625 है, और 0.01 वास्तव में 0.01000000000000000020816681711727285132943097676702828859375 है। ( BigDecimalमेरी बात साबित करने के लिए धन्यवाद ।:-P)

इसलिए (एक दशमलव फ़्लोटिंग पॉइंट या तर्कसंगत संख्या प्रकार अनुपस्थित है), इसे स्ट्रिंग के रूप में आउटपुट करना प्रदर्शन के लिए आवश्यक सटीक सटीकता के लिए इसे छंटनी करने का एकमात्र तरीका है।


28
कम से कम जावास्क्रिप्ट मुझे कुछ उंगली-काम बचा सकता है और इसे एक नंबर पर वापस बदल सकता है ... शीश ...
डेरेक अडायर

10
@ डेरेक: हाँ, लेकिन एक बार जब आप इसे एक नंबर में बदल देते हैं, तो आप फिर से उसी अशुद्धि के मुद्दों में भाग जाते हैं। :-P JS में दशमलव फ़्लोटिंग पॉइंट या तर्कसंगत संख्याएँ नहीं हैं।
क्रिस जस्टर-यंग

1
@DerekAdair मैंने हाल ही में एक पोस्ट लिखी है जो आगे भी यह बताती है कि आप इसमें रुचि ले सकते हैं। आनंद लें! stackoverflow.com/a/27030789/13
क्रिस जस्टर-यंग

7
वास्तव में इसने मुझे इस विषय में कुछ बहुत भारी शोध करने के लिए प्रेरित किया! आपकी सभी मदद का धन्यवाद!
डेरेक अडेयर

2
आपका उत्तर थोड़ा भ्रामक है: toFixedएक प्रारूपण फ़ंक्शन है, जिसमें संख्या को स्ट्रिंग में परिवर्तित करने का एकमात्र उद्देश्य है, यह निर्दिष्ट संख्याओं का उपयोग करके प्रारूपण करता है। यह एक स्ट्रिंग लौटाता है इसका कारण यह है कि यह एक स्ट्रिंग वापस करने वाला है, और यदि इसके toStringFixedबजाय इसका नाम दिया गया, तो ओपी परिणामों पर आश्चर्यचकित नहीं होगा। यहाँ एकमात्र मुद्दा यह है कि ओपी ने Math.roundजेएस संदर्भ से परामर्श के बिना, जैसे काम करने की उम्मीद की थी ।
Groo

177

Number.prototype.toFixedएक ऐसा फंक्शन है जिसे प्रिंट करने से पहले एक संख्या को प्रारूपित करने के लिए डिज़ाइन किया गया है। यह के परिवार से है toString, toExponentialऔर toPrecision

एक संख्या को गोल करने के लिए, आप ऐसा करेंगे:

someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;

// if you need 3 digits, replace 1e2 with 1e3 etc.
// or just copypaste this function to your code:

function toFixedNumber(num, digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(num*pow) / pow;
}

या यदि आप एक " देशी जैसा " फ़ंक्शन चाहते हैं, तो आप प्रोटोटाइप का विस्तार कर सकते हैं:

Number.prototype.toFixedNumber = function(digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;


//or even hexadecimal

someNumber = 0xAF309/256  //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";

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


12
मुझे लगता है कि यह सबसे अच्छा जवाब है। यह प्रकार रूपांतरण से बचता है। अद्भुत सॉस!
फिल

1
बहुत बढ़िया जवाब! हालांकि ... मैं 20 साल या तो जावास्क्रिप्ट की तरह कर रहा हूं, लेकिन मैं यह पता नहीं लगा सकता कि आप वापसी मूल्य के आसपास उस (...) निर्माण का उपयोग क्यों कर रहे हैं? धन्यवाद @ रसम में इसे रगड़ने के लिए :) जैसा कि मैं सीखने के लिए कभी बूढ़ा नहीं हुआ, कृपया विस्तार से
बताएं

1
@ HammerNL सैम के दोषी होने के बावजूद, यह कुछ भी नहीं करता है :) यह सिर्फ एक अभ्यास है - यह IDEs को इस फ़ंक्शन के रूप में पहचानता है type Number। बात यह है कि +(anyValue)हमेशा एक नंबर देता है - जैसे। +("45")लौटता है 45, +(new Number(42))लौटता है 42। यह थोड़े मजबूत टाइपिंग फंक्शन की तरह है। अगर आप इसकी आदत बना लेते हैं, तो आप बहुत से कीड़ों से बच सकते हैं :)
m93a

यह कोर जावास्क्रिप्ट में बेक नहीं किया गया है: s
वेबमास्टर

2
का resuit someNumber = Math.round( 42.008 * 1e2 ) / 1e2;नहीं है 42.01, यह है ~42.0099999999999980। कारण: संख्या 42.01मौजूद नहीं है और निकटतम मौजूदा संख्या में गोल है। btw, toPrecision(18)सभी प्रासंगिक अंकों के साथ इसे प्रिंट करने के लिए प्रमाण संख्या ।
वाईम

118

मैंने इसे बदलकर इस समस्या को हल किया है:

someNumber = someNumber.toFixed(2)

...इसके लिए:

someNumber = +someNumber.toFixed(2);

हालांकि यह संख्या को एक स्ट्रिंग में बदल देगा और इसे फिर से पार्स करेगा, जो प्रदर्शन पर महत्वपूर्ण प्रभाव डालेगा। यदि आप प्रदर्शन या सुरक्षा के बारे में परवाह करते हैं, तो अन्य उत्तरों की भी जाँच करें।


39
नहीं नहीं नहीं नहीं नहीं! ऐसा मत करो ! स्ट्रिंग रूपांतरण की संख्या केवल इसे पूरा करने के लिए एक बहुत बुरा अभ्यास है ! इसके बजाय करो someNumber = Math.round(someNumber * 1e2) / 1e2! अधिक सामान्यीकृत तरीके से मेरा उत्तर देखें।
m93a

@ m93a - यह इतनी बुरी प्रथा क्यों है?
jczaplew

3
@jczaplew क्योंकि अगर आप इसे इस तरह से करते हैं, तो 32 बिट बाइनरी नंबर को स्ट्रिंग में बदल दिया जाता है, जो कि हर देव-लानत दशमलव अंक के लिए 16 बिट्स का उपयोग करता है ! (वैसे UTF-16 में संख्याओं को संग्रहीत करना आपके लिए सबसे सुविधाजनक चीज़ नहीं है।) और स्ट्रिंग से वापस 32 बिट फ़्लोटिंग-पॉइंट संख्या में परिवर्तित हो जाती है। अंक से अंक। (यदि मैं सही पार्सिंग एल्गोरिदम को चुनने से पहले किए जाने वाले सभी परीक्षणों को अनदेखा करता हूं।) और सभी व्यर्थ पर विचार करते हुए आप इसे फ्लोट पर 3 तेज संचालन का उपयोग करके कर सकते हैं।
m93a 14

2
@ m93a तो यह प्रदर्शन कारणों के लिए है? क्या इससे वास्तव में प्रदर्शन पर ध्यान देने योग्य प्रभाव पड़ता है?
सेबस्टियनब

2
@jczaplew, क्योंकि स्ट्रिंग्स (1) व्यावहारिक रूप से धीमी हैं और (2) सैद्धांतिक रूप से गलत हैं।
पचेरियर

29

उपयोग क्यों नहीं parseFloat?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number

15

मैंने इसे जावास्क्रिप्ट Number()फ़ंक्शन के उपयोग से संख्या में वापस परिवर्तित करने के साथ हल किया

var x = 2.2873424;
x = Number(x.toFixed(2));

12

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


4

आप परिणाम को संख्या में बदलने के लिए बस '+' का उपयोग कर सकते हैं।

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03

3

जब आप किसी संख्या को प्रारूपित करना चाहते हैं, तो आप उससे क्या उम्मीद करेंगे? यदि आपके पास एक संख्या है तो आप बहुत कुछ इसके साथ नहीं कर सकते हैं क्योंकि जैसे 2 == 2.0 == 2.00आदि इसलिए यह एक स्ट्रिंग होना चाहिए।


3

स्ट्रिंग क्यों होना चाहिए इसका एक उदाहरण देने के लिए:

यदि आप 1.toFixed (2) प्रारूपित करते हैं, तो आपको '1.00' मिलेगा।

यह 1 के समान नहीं है, क्योंकि 1 में 2 दशमलव नहीं है।


मुझे पता है कि जावास्क्रिप्ट वास्तव में एक प्रदर्शन भाषा नहीं है , लेकिन संभावना है कि यदि आप किसी चीज़ का उपयोग करते हैं तो आप एक राउंडिंग के लिए बेहतर प्रदर्शन प्राप्त कर सकते हैं: राउंडवैल्यू = मैथ.आर्ड (मान * 100) * 0.01


2

क्योंकि इसका प्राथमिक उपयोग संख्या प्रदर्शित कर रहा है? यदि आप संख्याओं को गोल करना चाहते हैं, तो Math.round()उचित कारकों के साथ उपयोग करें ।


लेकिन यह NUMBERS प्रदर्शित कर रहा है तो क्या इसे "नंबर" वापस नहीं करना चाहिए?
डेरेक अडायर

3
@ डेरेक: केवल इस तरह से कि '42'एक संख्या है ... जो कि यह नहीं है। सिर्फ इसलिए कि एक स्ट्रिंग में अंक होने के लिए होता है केवल यह एक संख्या नहीं बनाता है। यह PHP नहीं है। :-P
क्रिस जस्टर-यंग

जबरदस्त हंसी। यह एक स्ट्रिंग नहीं है जिसमें एक संख्या होती है ... यह एक संख्या है जो एक विधि से पारित होती है। विधि एक संख्या लेती है और एक स्ट्रिंग लौटाती है।
डेरेक अडायर

@DerekAdair सही है लेकिन एक ब्राउज़र एक संख्या प्रदर्शित नहीं कर सकता है, यह स्ट्रिंग्स प्रदर्शित करता है, इस प्रकार रूपांतरण।
निक एम

1

यहां दिए गए उत्तर का थोड़ा अधिक कार्यात्मक संस्करण है m93a

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12

यह काम नहीं करता है अपरिभाषित प्रकार के लिए यह काम नहीं करता है, मैंने इस मामले के लिए कोड जोड़ा है; if (संख्या! == अपरिभाषित) {return + (Math.round (num * pow) / pow)} और (वापसी 0); }
डिनो लियू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.