जावास्क्रिप्ट: दशमलव स्थानों की एक संख्या के लिए दौर, लेकिन अतिरिक्त शून्य पट्टी


85

यहाँ परिदृश्य है: मैं हो रहा हूँ .9999999999999999जब मुझे होना चाहिए 1.0
मैं सटीकता के एक दशमलव स्थान को खोने का जोखिम उठा सकता हूं, इसलिए मैं उपयोग कर रहा हूं .toFixed(15), किस तरह का काम करता है।

गोलाई काम करती है, लेकिन समस्या यह है कि मुझे दिया गया है 1.000000000000000
वहाँ दशमलव स्थानों की एक संख्या के लिए एक रास्ता है, लेकिन अतिरिक्त व्हाट्सएप पट्टी?

नोट: .toPrecisionवह नहीं है जो मैं चाहता हूं; मैं केवल यह बताना चाहता हूं कि दशमलव बिंदु के बाद कितनी संख्या है।
नोट 2: मैं सिर्फ .toPrecision(1)इसलिए उपयोग नहीं कर सकता क्योंकि मुझे उन अंकों के लिए उच्च परिशुद्धता रखने की आवश्यकता है जो वास्तव में दशमलव बिंदु के बाद डेटा हैं। आदर्श रूप से, आवश्यक के रूप में कई दशमलव स्थानों में (15 तक) होगा।


जा रहा है कि बिंदु .toFixed एक स्ट्रिंग देता है, तो बस एक नंबर के माध्यम से इसे राउंड-ट्रिपिंग और फिर एक स्ट्रिंग में वापस करने के बाद इसे पीछे वाले शून्य के बिना वापस कर दिया जाएगा।
नील

@ नथन: सिर्फ स्पष्टीकरण के लिए। क्या आप अभी उस स्ट्रिंग में मौजूद शून्य को हटाना चाहते हैं, जो आपको toFixed () के साथ मिला है?
जिरी क्रिया

जवाबों:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
जब आप नकारात्मक संख्याओं का इलाज करते हैं, तो उन्हें कोष्ठक में रखना न भूलें: ऑपरेटर की पूर्वता के कारण -2.34.toFixed(1)रिटर्न । -2.3
Константин Ван

1
Unary + ऑपरेटर का उपयोग parseFloatफंक्शन की तुलना में तेज़ होना चाहिए : +number.toFixed(13)इस एक्सप्रेशन का उपयोग 1.0000000000000045 में जावास्क्रिप्ट संख्या की अशुद्धियों को दूर करने के लिए भी किया जा सकता है।
योगो

37

हां वहां एक रास्ता है। का उपयोग करें parseFloat()

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1

यहां एक जीवंत उदाहरण देखें: http://jsfiddle.net/nayish/7JBJw/


1
के लिए काम नहीं करता है parseFloat("0.0000007"), जो देता है"7e-7"
मैट Huggins

19

जैसा कि मैं समझता हूं, आप स्ट्रिंग स्ट्रिंग के शून्य को हटाना चाहते हैं जिसे आपने प्राप्त किया था toFixed()। यह एक शुद्ध स्ट्रिंग ऑपरेशन है:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
आप केवल एक ही व्यक्ति हैं जिन्होंने वास्तव में सवाल का जवाब दिया है .. धन्यवाद!
मुगन

4
यह गोल संख्याओं पर डॉट को छोड़ता है ("100.00" => "100.")
अंकित करें

5
@ यदि आप डॉट नहीं चाहते हैं तो आप इसे नियमित अभिव्यक्ति में प्रतिस्थापित करने के लिए शामिल कर सकते हैं ( ...replace(/\.?0+$/, "");)।
ज़ैक स्नो

यह 0 और -0 पर विफल रहता है क्योंकि 0खाली स्ट्रिंग बन जाता है , ""और -0बन जाता है -, जिसमें से न तो अपेक्षित है (एक अनुमान पर)। @ zach-snow आपके सुझाए गए समाधान भी 0 और -0 पर विफल रहता है।
रोबोकट

@ मगन, गस के जवाब में क्या दिक्कत थी?
trysis

9

Number(n.toFixed(15)) or +(n.toFixed(15)) अनुगामी शून्य को हटाते हुए 15 स्थान दशमलव स्ट्रिंग को एक संख्या में बदल देगा।


1
सोचा था कि मैं इसे इंगित करूंगा, + (n.toFixed (...) parseFloat की तुलना में बहुत अधिक कुशल है। यकीन नहीं क्यों, लेकिन इसकी भी क्रोम में संख्या से अधिक कुशल है।
डोमिनोज

8

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

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

यह यूनीरी + ऑपरेटर का उपयोग करता है , इसलिए यदि इसे एक स्ट्रिंग ऑपरेशन के हिस्से के रूप में उपयोग किया जाए तो आपको इसके पहले एक infix + होना चाहिए var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));:। FYI करें एक स्ट्रिंग के सामने एक unary + इसे संख्या में परिवर्तित करता है। MDN से: Unary + can:

पूर्णांक और फ़्लोट्स के स्ट्रिंग प्रतिनिधित्व, साथ ही साथ गैर-स्ट्रिंग मानों को सत्य, असत्य और अशक्त में परिवर्तित करें। दशमलव और हेक्साडेसिमल ("0x" -प्रकाशित) दोनों स्वरूपों में पूर्णांक समर्थित हैं। नकारात्मक संख्याएं समर्थित हैं (हालांकि हेक्स के लिए नहीं)। यदि यह किसी विशेष मूल्य को पार्स नहीं कर सकता है, तो यह NaN का मूल्यांकन करेगा।


@robocat मैंने अभी एक साधारण जाँच की है; +(4.1).toFixed(4)है 4.1में क्रोम 60
Константин Ван

मुझे नहीं मिला। ऐसा क्या कारण था जिसके कारण यह उत्तर समाप्त हो गया?
Константин Ван

@K आप सही थे इसलिए मैंने अपनी पिछली टिप्पणी को हटा दिया और उत्तर में जोड़ा (मुझे लगता है कि मैं infix + का उपयोग कर रहा था lhs पर एक स्ट्रिंग के साथ, बल्कि unary + का सही उपयोग करके। आमतौर पर मैं अधिक सावधान हूँ! चीयर्स)
robocat

यह उत्तर अभी भी NaN, Infinity, -Infinity, 3e30 और 0. के साथ काम करता है। कुछ अन्य उत्तर कुछ कोने के मामलों में विफल हो जाते हैं।
रोबोकट

(4) .toFixed (2) -> "4.00" क्रोम में 60.0.3112.113
डैनियल Que

1

इनमें से कोई भी वास्तव में मुझे नहीं मिला जो मैं प्रश्न शीर्षक के आधार पर देख रहा था, जो कि उदाहरण के लिए, 5.00 से 5 और 5.10 से 5.1 हो गया था। मेरा समाधान इस प्रकार था:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

नोट: रेगेक्स केवल तभी काम करता है जब places > 0

PS https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


पर विफल 5e30(संख्या में परिवर्तन 5e3)। कॉर्नर के मामले शैतानी हैं!
रोबोकट

0

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

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

toFixed()विधि एक प्रारूप numberका उपयोग कर निश्चित बिन्दु अंकन, और एक रिटर्न string

यह एक आधा-अप राउंडिंग रणनीति लागू करता है ।

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

जैसा कि आपने वर्णित किया है, यह वास्तव में कभी-कभी शून्य (अनुगामी) का परिणाम होगा।

(0.001).toFixed(2); // returns 0.00

आप उन अनुगामी शून्य से छुटकारा पाना नहीं चाहते हैं, अनिवार्य रूप से आप इसे सिर्फ एक में बदल सकते हैं number। इसे करने के कई तरीके हैं।

+(0.001).toFixed(2); // the shortest

एक अवलोकन के लिए, स्ट्रिंग्स को संख्याओं में बदलने के विभिन्न तरीकों के लिए, कृपया इस प्रश्न की जांच करें , जिसमें कुछ उत्कृष्ट उत्तर हैं।

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