क्या मुझसे कोई चूक हो रही है?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
क्यों करता है.toFixed()
एक स्ट्रिंग वापसी?
मैं संख्या को 2 दशमलव अंकों में गोल करना चाहता हूं।
क्या मुझसे कोई चूक हो रही है?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
क्यों करता है.toFixed()
एक स्ट्रिंग वापसी?
मैं संख्या को 2 दशमलव अंकों में गोल करना चाहता हूं।
जवाबों:
यह एक स्ट्रिंग लौटाता है क्योंकि 0.1, और इसकी शक्तियां (जिसका उपयोग दशमलव अंशों को प्रदर्शित करने के लिए किया जाता है), बाइनरी फ्लोटिंग-पॉइंट सिस्टम में प्रतिनिधित्व योग्य (कम से कम पूरी सटीकता के साथ नहीं) हैं।
उदाहरण के लिए, 0.1 वास्तव में 0.1000000000000000055511151231257827021181583404541415625 है, और 0.01 वास्तव में 0.01000000000000000020816681711727285132943097676702828859375 है। ( BigDecimal
मेरी बात साबित करने के लिए धन्यवाद ।:-P)
इसलिए (एक दशमलव फ़्लोटिंग पॉइंट या तर्कसंगत संख्या प्रकार अनुपस्थित है), इसे स्ट्रिंग के रूप में आउटपुट करना प्रदर्शन के लिए आवश्यक सटीक सटीकता के लिए इसे छंटनी करने का एकमात्र तरीका है।
toFixed
एक प्रारूपण फ़ंक्शन है, जिसमें संख्या को स्ट्रिंग में परिवर्तित करने का एकमात्र उद्देश्य है, यह निर्दिष्ट संख्याओं का उपयोग करके प्रारूपण करता है। यह एक स्ट्रिंग लौटाता है इसका कारण यह है कि यह एक स्ट्रिंग वापस करने वाला है, और यदि इसके toStringFixed
बजाय इसका नाम दिया गया, तो ओपी परिणामों पर आश्चर्यचकित नहीं होगा। यहाँ एकमात्र मुद्दा यह है कि ओपी ने Math.round
जेएस संदर्भ से परामर्श के बिना, जैसे काम करने की उम्मीद की थी ।
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";
हालाँकि , इस बात को ध्यान में रखें कि जब आप मॉड्यूल लिख रहे हों तो प्रोटोटाइप को प्रदूषित करना बुरा माना जाता है, क्योंकि मॉड्यूल का कोई दुष्प्रभाव नहीं होना चाहिए। इसलिए, एक मॉड्यूल के लिए, पहले फ़ंक्शन का उपयोग करें ।
type Number
। बात यह है कि +(anyValue)
हमेशा एक नंबर देता है - जैसे। +("45")
लौटता है 45
, +(new Number(42))
लौटता है 42
। यह थोड़े मजबूत टाइपिंग फंक्शन की तरह है। अगर आप इसकी आदत बना लेते हैं, तो आप बहुत से कीड़ों से बच सकते हैं :)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
नहीं है 42.01
, यह है ~42.0099999999999980
। कारण: संख्या 42.01
मौजूद नहीं है और निकटतम मौजूदा संख्या में गोल है। btw, toPrecision(18)
सभी प्रासंगिक अंकों के साथ इसे प्रिंट करने के लिए प्रमाण संख्या ।
मैंने इसे बदलकर इस समस्या को हल किया है:
someNumber = someNumber.toFixed(2)
...इसके लिए:
someNumber = +someNumber.toFixed(2);
हालांकि यह संख्या को एक स्ट्रिंग में बदल देगा और इसे फिर से पार्स करेगा, जो प्रदर्शन पर महत्वपूर्ण प्रभाव डालेगा। यदि आप प्रदर्शन या सुरक्षा के बारे में परवाह करते हैं, तो अन्य उत्तरों की भी जाँच करें।
someNumber = Math.round(someNumber * 1e2) / 1e2
! अधिक सामान्यीकृत तरीके से मेरा उत्तर देखें।
उपयोग क्यों नहीं parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
बेशक यह एक स्ट्रिंग लौटाता है। यदि आप संख्यात्मक चर को गोल करना चाहते हैं, तो आप इसके बजाय Math.round () का उपयोग करेंगे। OfFixed का बिंदु उपयोगकर्ता को प्रदर्शन के लिए दशमलव स्थानों की निश्चित संख्या के साथ संख्या को प्रारूपित करना है ।
स्ट्रिंग क्यों होना चाहिए इसका एक उदाहरण देने के लिए:
यदि आप 1.toFixed (2) प्रारूपित करते हैं, तो आपको '1.00' मिलेगा।
यह 1 के समान नहीं है, क्योंकि 1 में 2 दशमलव नहीं है।
मुझे पता है कि जावास्क्रिप्ट वास्तव में एक प्रदर्शन भाषा नहीं है , लेकिन संभावना है कि यदि आप किसी चीज़ का उपयोग करते हैं तो आप एक राउंडिंग के लिए बेहतर प्रदर्शन प्राप्त कर सकते हैं: राउंडवैल्यू = मैथ.आर्ड (मान * 100) * 0.01
क्योंकि इसका प्राथमिक उपयोग संख्या प्रदर्शित कर रहा है? यदि आप संख्याओं को गोल करना चाहते हैं, तो Math.round()
उचित कारकों के साथ उपयोग करें ।
'42'
एक संख्या है ... जो कि यह नहीं है। सिर्फ इसलिए कि एक स्ट्रिंग में अंक होने के लिए होता है केवल यह एक संख्या नहीं बनाता है। यह PHP नहीं है। :-P
यहां दिए गए उत्तर का थोड़ा अधिक कार्यात्मक संस्करण है 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