जावास्क्रिप्ट के साथ एक संख्या का दशमलव भाग प्राप्त करें


247

मेरे पास फ्लोट नंबर हैं जैसे 3.2और 1.6

मुझे संख्या को पूर्णांक और दशमलव भाग में अलग करने की आवश्यकता है। उदाहरण के लिए, के एक मूल्य के 3.2दो नंबर में विभाजित किया गया, यानी 3और0.2

पूर्णांक भाग प्राप्त करना आसान है:

n = Math.floor(n);

लेकिन मुझे दशमलव भाग प्राप्त करने में समस्या हो रही है। मैंने यह कोशिश की है:

remainer = n % 2; //obtem a parte decimal do rating

लेकिन यह हमेशा सही तरीके से काम नहीं करता है।

पिछले कोड में निम्न आउटपुट है:

n = 3.1 => remainer = 1.1

मुझे यहाँ क्या याद आ रहा है?


1
ध्यान दें कि n = Math.floor(n);गैर-नकारात्मक संख्याओं के लिए केवल आपका वांछित परिणाम (पूर्णांक भाग)
लौटाया जा रहा है

सिंप्लीफाइ उपयोग % 1नहीं% 2
मास्टरएक्सिलो

जवाबों:


366

का उपयोग करें 1, नहीं 2

js> 2.3 % 1
0.2999999999999998

59
ऐसी दुनिया में जहां 0.2999999999999998 0.3 के बराबर है यह स्वीकार्य हो सकता है। मेरे लिए यह नहीं है ... इसलिए, इस चुनौती को हल करने के लिए मैं उपयोग Math.*या %संचालन से बचना चाहूंगा ।
मार्सेल ने 14

62
फ़्लोटिंग पॉइंट राउंडिंग समस्याओं से बचने के लिए, toFixedकुछ स्थितियों का उपयोग करके मदद कर सकते हैं जैसे (2.3 % 1).toFixed(4)== "0.3000"
ब्रायन एम। हंट

12
(2.3 % 1).toFixed(4).substring(2)= "3000"यदि आपको इसकी आवश्यकता है0.
शमौन_ वीवर

14
एक ऐसी दुनिया में जहां संख्या 2.3पैदा हुई है, 2या नहीं 3, यह संख्या 0.2999999999999998पूरी तरह से स्वीकार्य है इसके बावजूद कि यह मानव आंखों के लिए कितना अपमानजनक है।
गेरशोम

1
@GershomMaes विभिन्न प्रकार की परिस्थितियां हैं जहां यह संख्या स्वीकार्य नहीं है।
एडम लेगट

92
var decimal = n - Math.floor(n)

हालांकि यह माइनस नंबरों के लिए काम नहीं करेगा इसलिए हमें करना पड़ सकता है

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)

यदि आपके पास पहले से ही पूर्णांक भाग है, तो Math.floor()फिर से कॉल करने की आवश्यकता नहीं है - बस उस पूर्णांक वाले भाग का उपयोग करें जिसकी आपने गणना की है।
तवान्फोसन

4
var n = 3.2, integr = Math.floor(n), decimal = n - integr;केवल एक बार Math.floor () का उपयोग करें । integr = 3; decimal = 0.20000000000000018;
नुरलान

2
नकारात्मक संख्या के साथ काम करने के लिए, बस के Math.floorसाथ स्वैप करें Math.trunc
इगोर सिल्वा

यह एक गैर सटीक संख्या की वापसी कर रहा था जैसे मुझे 100.80 से 0.80 प्राप्त करने की उम्मीद थी, न कि 0.79999 ... मैंने इसे दशमलव में जोड़ा। इसे हल किया (2)
लुइस फिरा

76

आप स्ट्रिंग में बदल सकते हैं, है ना?

n = (n + "").split(".");

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

8
मैं महाद्वीपीय यूरोप से एक फ्रांसीसी फ़ायरफ़ॉक्स के साथ हूँ और यह काम करता है। आम तौर पर हम फ्रांस में अल्पविराम को दशमलव विभाजक के रूप में उपयोग करेंगे। इसका कारण यह है कि जावास्क्रिप्ट में कोई संस्कृति शामिल नहीं है जब एक संख्या को स्ट्रिंग में परिवर्तित किया जाता है, हालांकि मैं n.toString()इसके बजाय n + ""इसका उपयोग करना पसंद करूंगा क्योंकि यह अधिक पठनीय है।
गेब्रियल हौटक्लोक

2
यदि गति महत्वपूर्ण है, तो n + ""वास्तव में बेहतर है (देखें jsperf.com/number-vs-number-tostring-vs-string-number )
गेब्रियल हौटलक्कल

@ cdmdotnet JS .एक दशमलव विभाजक के रूप में उपयोग करता है ताकि आप हर जगह ठीक रहें यदि आपका इनपुट चर का फ्लोट है। आपको केवल उस समस्या से निपटना होगा यदि आपका इनपुट स्ट्रिंग है। मुझे यह भी ध्यान रखना है कि यह उत्तर एक सरणी में एक स्ट्रिंग देता है। एक और पूर्ण समाधान हैparseFloat('0.' + (n + '').split('.')[1])
totymedli

@cdmdotnet स्थान स्वतंत्र समाधान यहाँ है: stackoverflow.com/a/59469716/1742529
user1742529

32

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

मैं यह करूँगा:

var decPart = (n+"").split(".")[1];

विशेष रूप से, मैं 100233.1 का उपयोग कर रहा था और मुझे उत्तर "1" चाहिए था।


6
मैं आमतौर पर सहमत हूं लेकिन आप 'पर भरोसा नहीं कर सकते।' दशमलव विभाजक के रूप में regex एक i18n वर्ण है
मार्सेल ने 14

1
@jomofrodo वास्तव में, कुछ गैर गोल मूल्य चाहते हो सकता है। मैं एक गोल मूल्य के लिए पूछ रहे ओपी को याद नहीं करता हूं, बस मूल्यों को विभाजित करता हूं।
वीवीवी

1
@VVV हाँ, कुछ गैर गोल मूल्य चाहते हो सकता है। लेकिन सिर्फ इसलिए कि आप 9 दशमलव स्थानों पर परिशुद्धता चाहते हैं, इसका मतलब यह नहीं है कि आपका इनपुट डेटा वास्तव में इसका समर्थन करता है। यही कारण है कि इसे "झूठी परिशुद्धता" कहा जाता है। यदि आपका इनपुट 3.1 है, तो आपके उत्तर के लिए सबसे सटीक दसवां भाग हो सकता है, अर्थात .1। यदि आप .09 का उत्तर देते हैं, तो इसका मतलब है कि आपने वास्तव में 100 वीं परिशुद्धता तक की गणना / माप की है, जब वास्तव में मूल इनपुट केवल 10 वीं सटीकता के लिए सटीक था।
jomofrodo

1
@ मार्सेलस्टो जिसे आसानी से संभाला जा सकता है: var decPart = (n.toLocaleString ("" "))। स्प्लिट ("। ") [1];
जेम

1
.toString()i18n पर विचार नहीं करता है। दशमलव विभाजक हमेशा . MDN और ECMA युक्ति के
एंड्रयूमैट

18

यहां बताया गया है कि मैं इसे कैसे करता हूं, जो मुझे लगता है कि यह करने का सबसे सरल तरीका है:

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2

15

यह करने का एक सरल तरीका है:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018

दुर्भाग्य से, यह सटीक मूल्य वापस नहीं करता है। हालांकि, यह आसानी से तय हो गया है:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals.toFixed(1)); //Returns 0.2

यदि आप दशमलव स्थानों की संख्या नहीं जानते हैं तो आप इसका उपयोग कर सकते हैं:

var x = 3.2;
var decimals = x - Math.floor(x);

var decimalPlaces = x.toString().split('.')[1].length;
decimals = decimals.toFixed(decimalPlaces);

console.log(decimals); //Returns 0.2


9

भाषा स्वतंत्र तरीका:

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3

ध्यान दें कि यह केवल एक फ्रैक्चरल लेन्थ के साथ संख्याओं के लिए सही है)


3
क्या आप बता सकते हैं कि आपको क्यों लगता है कि यह भाषा स्वतंत्र है? यह जावास्क्रिप्ट है।
हॉटज़स्ट

4
@hotzst, वहाँ कोई भाषा विशेष समारोह है
Nurlan

1
भाषा स्वतंत्र है क्योंकि यह सिर्फ शुद्ध गणित है। व्यावहारिक समाधान। वांछित अंश लंबाई के साथ:var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
muratgozel

6

आप parseInt()दशमलव भाग को निकालने के लिए पूर्णांक भाग को प्राप्त करने के लिए फ़ंक्शन का उपयोग कर सकते हैं

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;

या आप regex का उपयोग कर सकते हैं जैसे:

splitFloat = function(n){
   const regex = /(\d*)[.,]{1}(\d*)/;
   var m;

   if ((m = regex.exec(n.toString())) !== null) {
       return {
          integer:parseInt(m[1]),
          decimal:parseFloat(`0.${m[2]}`)
       }
   }
}

दशमलवपार्ट आ रहा है 0.20000000000000018... यह वास्तव में करना मुश्किल हो रहा है क्योंकि 0.2 < 0.20000000000000018रिटर्न सही है .. 3.2 को वापस लौटना माना जाता है 0.2: पी बहुत सारी अनियमितताएं कर रहा है और .toFixed(2)रिटर्न स्ट्रिंग का उपयोग कर रहा है: पी
हिमांशु बंसल

@HansanshuBansal यह एक जावास्क्रिप्ट समस्या है ( उस के लिए एक स्टैकओवरफ़्लो प्रश्न )। आप दूसरे मेथोड का उपयोग कर सकते हैं जो मैंने सुझाया था।
शेकी

वैसे मेरे पास एक lil 'बिट डिफरेंट प्रॉब्लम स्टेटमेंट है ... Kinda ने उर तरीके दोनों का इस्तेमाल किया: P इसे हल करने के लिए .. ^ ^
हिमांशु बंसल

@ हिमांशु बंसल को खुशी हुई कि मेरी पोस्ट से आपकी समस्या हल हो गई!
शकी

5

दशमलव विभाजक के लिए क्षेत्रीय सेटिंग्स की परवाह किए बिना निम्नलिखित कार्य करता है ... इस शर्त पर कि विभाजक के लिए केवल एक वर्ण का उपयोग किया जाता है।

var n = 2015.15;
var integer = Math.floor(n).toString();
var strungNumber = n.toString();
if (integer.length === strungNumber.length)
  return "0";
return strungNumber.substring(integer.length + 1);

यह सुंदर नहीं है, लेकिन यह सटीक है।


यह निश्चित रूप से एक स्ट्रिंग है, इसलिए यदि आप इसे नंबर के रूप में चाहते हैं तो आप पहले पार्सइंट () में प्रवेश कर सकते हैं। आपको parseFloat () की आवश्यकता नहीं होनी चाहिए ... जब तक कि कुछ ऐसा न हो कि मैं यहां आधार 8 के साथ गायब हूं, न कि आधार 10 नंबर ... कुछ साल पहले मुझे याद है
cdmdotnet

5

यदि सटीकता मायने रखती है और आपको लगातार परिणामों की आवश्यकता होती है, तो यहां कुछ प्रस्ताव दिए गए हैं जो किसी भी संख्या के दशमलव भाग को स्ट्रिंग के रूप में लौटाएंगे, जिसमें प्रमुख "0." भी शामिल है। यदि आपको फ्लोट के रूप में इसकी आवश्यकता है, तो बस var f = parseFloat( result )अंत में जोड़ें ।

यदि दशमलव भाग शून्य के बराबर है, तो "0.0" वापस कर दिया जाएगा। अशक्त, NaN और अपरिभाषित संख्याओं का परीक्षण नहीं किया जाता है।

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );

2. String.substring, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");

3. Math.floor, Number.toFixed, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");

4. Math.floor, Number.toFixed, String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = (narray.length > 1 ? (n - Math.floor(n)).toFixed(narray[1].length) : "0.0");

यहाँ एक jsPerf लिंक दिया गया है: https://jsperf.com/decpart-of-number/

हम देख सकते हैं कि प्रस्ताव # 2 सबसे तेज़ है।


इनमें से किसी का भी उपयोग न करें। जैसे ही नंबर रेंडरिंग इंजीनियरिंग में आएगी, वे टूट जाएंगे। वे स्थानीय-संवेदनशील भी नहीं हैं।
२०:१० पर स्पंज

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

4

आप इसे एक स्ट्रिंग में replaceबदल सकते हैं और पूर्णांक भाग को शून्य से बदलने के लिए विधि का उपयोग कर सकते हैं , फिर परिणाम को एक संख्या में बदल सकते हैं:

var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');

क्या यह समाधान महाद्वीपीय यूरोप में काम नहीं करेगा जहाँ अल्पविराम दशमलव विभाजक है ??
प्रेस्टन

@preston आप रिजेक्स में डॉट को किसी भी अन्य विभाजक चरित्र के साथ बदल सकते हैं जिसे आप पसंद करते हैं (जैसे कि /^[^,]/), लेकिन आपको परिणाम +से बचने के लिए स्ट्रिंग ( ऑपरेटर को हटा दें ) के रूप में परिणाम छोड़ देना चाहिए NaN
gion_13

4

उपयोग के आधार पर आप बाद में देंगे, लेकिन यह सरल समाधान भी आपकी मदद कर सकता है।

Im इसे एक अच्छा समाधान नहीं कह रहा है, लेकिन कुछ ठोस मामलों के लिए काम करता है

var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2)  //False

लेकिन यह @ ब्रायन एम। हंट द्वारा प्रस्तावित समाधान से अधिक समय लगेगा

(2.3 % 1).toFixed(4)

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

1

मेरे पास एक ऐसा मामला था जहां मुझे पता था कि प्रश्न में सभी संख्याओं में केवल एक दशमलव होगा और दशमलव भाग को पूर्णांक के रूप में प्राप्त करना चाहता था, इसलिए मैंने इस तरह के दृष्टिकोण का उपयोग करके समाप्त किया:

var number = 3.1,
    decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1

यह पूरी तरह से पूर्णांक के साथ भी काम करता है, उन मामलों में 0 वापस करता है।


1

मै इस्तेमाल कर रहा हूँ:

var n = -556.123444444;
var str = n.toString();
var decimalOnly = 0;

if( str.indexOf('.') != -1 ){ //check if has decimal
    var decimalOnly = parseFloat(Math.abs(n).toString().split('.')[1]);
}

इनपुट: -556.123444444

परिणाम: 123444444


1

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

(3.2+'').replace(/^[-\d]+\./, '')

1

एक अच्छा विकल्प नंबर को एक स्ट्रिंग में बदलना और फिर उसे विभाजित करना है।

// Decimal number
let number = 3.2;

// Convert it into a string
let string = number.toString();

// Split the dot
let array = string.split('.');

// Get both numbers
// The '+' sign transforms the string into a number again
let firstNumber  = +array[0]; // 3
let secondNumber = +array[1]; // 2

कोड की एक पंक्ति में

let [firstNumber, secondNumber] = [+number.toString().split('.')[0], +number.toString().split('.')[1]];

0

इनमें से कई को देखने के बाद, मैं अब उपयोग कर रहा हूं ...

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);


0

हालाँकि मुझे इसका उत्तर देने में बहुत देर हो गई है, कृपया कोड पर एक नज़र डालें।

let floatValue = 3.267848;
let decimalDigits = floatValue.toString().split('.')[1];
let decimalPlaces = decimalDigits.length;
let decimalDivider = Math.pow(10, decimalPlaces);
let fractionValue = decimalDigits/decimalDivider;
let integerValue = floatValue - fractionValue;

console.log("Float value: "+floatValue);
console.log("Integer value: "+integerValue);
console.log("Fraction value: "+fractionValue)

0

फ़्लोटिंग-पॉइंट दशमलव संकेत और संख्या प्रारूप देश से निर्भर हो सकता है ( .,), इसलिए स्वतंत्र समाधान, जो फ्लोटिंग पॉइंट पार्ट संरक्षित है, वह है:

getFloatDecimalPortion = function(x) {
    x = Math.abs(parseFloat(x));
    let n = parseInt(x);
    return Number((x - n).toFixed(Math.abs((""+x).length - (""+n).length - 1)));
}

- स्थान-निर्भर के बजाय यह अंतर्राष्ट्रीयकरण समाधान है:

getFloatDecimalPortion = x => parseFloat("0." + ((x + "").split(".")[1]));

समाधान desription कदम से कदम:

  1. parseFloat() इनपुट cocrrection गारंटी देने के लिए
  2. Math.abs() नकारात्मक संख्या के साथ समस्याओं से बचने के लिए
  3. n = parseInt(x) दशमलव भाग प्राप्त करने के लिए
  4. x - n दशमलव भाग को बदलने के लिए
  5. अब हमारे पास शून्य दशमलव भाग के साथ संख्या है, लेकिन जावास्क्रिप्ट हमें अतिरिक्त अस्थायी भाग अंक दे सकता है, जो हम नहीं चाहते हैं
  6. तो, toFixed()मूल फ्लोट संख्या के अस्थायी भाग में अंकों की गिनती के साथ कॉल करके अतिरिक्त अंकों को सीमित करें x। गणना को उनके स्ट्रिंग प्रतिनिधित्व में मूल संख्या xऔर संख्या की लंबाई के बीच अंतर के रूप में गणना की जाती है n

-1

इस एक का उपयोग करें:

function isNatural(n) {
    n = +n
    if (isNaN(n)) return 'NaN';
    return (n >= 0.0) && (Math.floor(n) === n) && n !== Infinity;
  }

Math.frac = function frac(x, m) {
    x = +x
    if (isNaN(x)) return NaN;
    if (isNatural(x) === true) return 0;
    m = +m || 1

      if (isNatural(x) === false && m === 1){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c
        return d;
      }

      if (isNatural(x) === false && m === 2){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = +b
        return c;
      }

      if (isNatural(x) === false && m === 3){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c * 100
        return d;
      }    
  }

Math.fracसमारोह यहां 3 मोड हैं:

Math.frac(11.635) //0.635
Math.frac(11.635, 1) //0.635 - default mode is 1
Math.frac(11.635, 2) //635
Math.frac(11.635, 3) //63,5 (%)

यह आसान है :)


-9
float a=3.2;
int b=(int)a; // you'll get output b=3 here;
int c=(int)a-b; // you'll get c=.2 value here

4
यह मेरे लिए जावास्क्रिप्ट की तरह नहीं दिखता है!
चामर

1
यह जावा स्क्रिप्ट नहीं है
अमृत

जेएस में यह होना चाहिए: var a = 3.2; var b = parseInt (ए, 10); var c = a - b;
जू-वि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.