मैं एक फ्लोट को जावास्क्रिप्ट में पूरी संख्या में बदलना चाहता हूं। वास्तव में, मैं जानना चाहता हूं कि मानक रूपांतरणों को कैसे किया जाए: छंटनी और गोलाई द्वारा। और कुशलता से, एक स्ट्रिंग और पार्सिंग में परिवर्तित करने के माध्यम से नहीं।
मैं एक फ्लोट को जावास्क्रिप्ट में पूरी संख्या में बदलना चाहता हूं। वास्तव में, मैं जानना चाहता हूं कि मानक रूपांतरणों को कैसे किया जाए: छंटनी और गोलाई द्वारा। और कुशलता से, एक स्ट्रिंग और पार्सिंग में परिवर्तित करने के माध्यम से नहीं।
जवाबों:
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
नकारात्मक
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
पॉजिटिव - बड़ी संख्या
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
ऋणात्मक - बड़ी संख्या
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
var intValue = ~~floatValue;
। यदि नोटेशन आपके स्वाद के लिए बहुत अस्पष्ट है, तो बस इसे किसी फ़ंक्शन में छिपाएं function toInt(value) { return ~~value; }
:। (यह स्ट्रिंग्स को पूर्णांकों में भी परिवर्तित करता है, अगर आप ऐसा करना चाहते हैं।)
Math.trunc(val);
टिप्पणी करें क्योंकि यह स्वीकृत उत्तर है
2.3 - 2.3 % 1
एक बिटवाइज़ या ऑपरेटर का उपयोग फ़्लोटिंग पॉइंट आकृतियों को छोटा करने के लिए किया जा सकता है और यह सकारात्मक के साथ-साथ नकारात्मक के लिए भी काम करता है:
function float2int (value) {
return value | 0;
}
परिणाम
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
मैंने एक JSPerf परीक्षण बनाया है, जो प्रदर्शन के बीच तुलना करता है:
Math.floor(val)
val | 0
बिटवार या~~val
बिट वाइज नहींparseInt(val)
यह केवल सकारात्मक संख्याओं के साथ काम करता है। इस मामले में आप Math.floor
फ़ंक्शन के रूप में बिटवाइज़ संचालन का उपयोग करने के लिए सुरक्षित हैं ।
लेकिन अगर आपको अपने कोड को सकारात्मक और नकारात्मक के साथ काम करने की आवश्यकता है , तो एक बिटवाइज़ ऑपरेशन सबसे तेज़ है (या पसंदीदा होने के नाते)। यह अन्य JSPerf परीक्षण उसी की तुलना करता है जहां यह बहुत स्पष्ट है कि अतिरिक्त हस्ताक्षर की वजह से गणित अब चार में से सबसे धीमा है।
जैसा कि टिप्पणियों में कहा गया है, BITWISE ऑपरेटरों ने हस्ताक्षर किए गए 32 बिट पूर्णांक पर काम किया है, इसलिए बड़ी संख्या में रूपांतरण किया जाएगा, उदाहरण:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
Math.floor()
तो तेज है (कम से कम Google Chrome पर आपके पहले JSPerf परीक्षण के संस्करण के अनुसार, संस्करण 30.0.1599.101), अधिक मजबूत (क्योंकि यह निर्भर नहीं करता है कि संख्याओं का प्रतिनिधित्व बिट्स में कैसे किया जाता है,) जो बदल सकता है और संभवतः इस बिटवाइज़ समाधान को तोड़ सकता है), और सबसे महत्वपूर्ण बात, अधिक स्पष्ट।
~~
बेहतर है क्योंकि यह एक अपर ऑपरेटर है। 4.2|0+4
बराबरी 4
लेकिन ~~4.2+4
बराबर8
नोट: आप Math.floor()
ट्रंक के लिए प्रतिस्थापन के रूप में उपयोग नहीं कर सकते , क्योंकि Math.floor(-3.1) = -4
और नहीं -3
!!
ट्रंकट के लिए एक सही प्रतिस्थापन होगा:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
ECMAScript 6
floor
दौर की ओर -infinity, truncate
शून्य की ओर दौर। ( ceil
चक्कर + अनंत की ओर)।
डबल बिटवाइज़ नहीं ऑपरेटर को फ़्लोटक फ़्लोट करने के लिए उपयोग किया जा सकता है। अन्य कार्यों आप का उल्लेख उपलब्ध के माध्यम से कर रहे हैं Math.floor
, Math.ceil
और Math.round
।
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
फ़ॉन्ट रेंडरिंग इंजन कोडिंग के लिए आवश्यक था । धन्यवाद!
छंटनी के लिए:
var intvalue = Math.floor(value);
दौर के लिए:
var intvalue = Math.round(value);
आप बिना किसी गोलाई के parseInt विधि का उपयोग कर सकते हैं । 0x (हेक्स) और 0 (ऑक्टल) उपसर्ग विकल्पों के कारण उपयोगकर्ता इनपुट से सावधान रहें।
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
1 में परिणाम, न कि 1 000 000 000 000 000 000 000। वैसे भी, सवाल स्पष्ट रूप से " एक स्ट्रिंग और पार्सिंग में परिवर्तित नहीं करना चाहता था ", हालांकि यह अपेक्षाकृत मामूली है ...;)
parseInt()
एक स्ट्रिंग नहीं एक संख्या की उम्मीद है । जब आप इस पूर्णांक को पास करते हैं, तो इसे परिवर्तित किया जाता है 1e21
और फिर parseInt
स्ट्रिंग को पार्स किया जाता है 1e21
, जिसके परिणामस्वरूप 1
।
बिट शिफ्ट 0 से जो कि विभाजन से 1 के बराबर है
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
केवल पूर्णांक < 2 ^ 31-1 , और >>> 0
पूर्णांक < 2 ^ 32-1 के लिए काम करता है । यह बड़े मूल्यों के लिए 0 लौटाता है
आपके मामले में, जब आप अंत में एक स्ट्रिंग चाहते हैं (कॉमा डालने के लिए), तो आप केवल Number.toFixed()
फ़ंक्शन का उपयोग कर सकते हैं , हालांकि, यह राउंडिंग प्रदर्शन करेगा।
यहाँ कई सुझाव हैं। बिटवाइड या दूर से सबसे सरल प्रतीत होता है। यहां एक और संक्षिप्त समाधान है जो मोड्यूलो ऑपरेटर का उपयोग करके नकारात्मक संख्याओं के साथ काम करता है। यह शायद बिटवाइज़ की तुलना में समझना आसान है:
intval = floatval - floatval%1;
यह विधि उच्च मान संख्याओं के साथ भी काम करती है जहाँ न तो '0' और न ही '~~' और न ही '0' सही ढंग से काम करते हैं:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
छंटनी करने के लिए :
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
गोल करने के लिए :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
एक और संभव तरीका - XOR ऑपरेशन का उपयोग करें:
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
बिटवाइज़ ऑपरेशंस की प्राथमिकता गणित के संचालन की प्राथमिकता कम है, यह उपयोगी है। Https://jsfiddle.net/au51uj3r/ पर कोशिश करें
यदि Math
जावास्क्रिप्ट में देशी वस्तु को देखें, तो आपको संख्याओं और मानों आदि पर काम करने के लिए कार्यों का पूरा गुच्छा मिलता है ...
मूल रूप से आप जो करना चाहते हैं वह जावास्क्रिप्ट में काफी सरल और मूल है ...
कल्पना कीजिए कि आपके पास नीचे की संख्या है:
const myValue = 56.4534931;
और अब यदि आप इसे निकटतम संख्या में गोल करना चाहते हैं, तो बस करें:
const rounded = Math.floor(myValue);
और आपको मिलता है:
56
यदि आप इसे निकटतम संख्या तक गोल करना चाहते हैं, तो बस करें:
const roundedUp = Math.ceil(myValue);
और आपको मिलता है:
57
इसके अलावा Math.round
, यह उच्च या निम्न संख्या के लिए गोल होता है, जिस पर निर्भर करता है कि कोई फ़्लोट संख्या के करीब है।
इसके अलावा आप ~~
फ्लोट नंबर के पीछे का उपयोग कर सकते हैं , जो फ्लोट को पूरी संख्या में बदल देगा।
आप इसका उपयोग कर सकते हैं ~~myValue
...
~~
क्योंकि यदि संख्या इंट 32 सीमा से बड़ी है, तो यह मूल्य को इंट 32 सीमा मान में बदल देगा।
//Convert a float to integer
Math.floor(5.95)
//5
Math.ceil(5.95)
//6
Math.round(5.4)
//5
Math.round(5.5)
//6
Math.trunc(5.5)
//5
//Quick Ways
console.log(5.95| 0)
console.log(~~5.95)
console.log(5.95 >> 0)
//5
मैं सिर्फ यह बताना चाहता हूं कि आप जिस तरह से गोल करना चाहते हैं, वैसा नहीं है और न ही ट्रंक। एक पैसे से बंद होने की संभावना बहुत कम है, क्योंकि 4.999452 * 100 गोल आपको 5, एक अधिक प्रतिनिधि जवाब देगा।
और इसके शीर्ष पर, बैंकर की गोलाई के बारे में मत भूलना , जो कि थोड़ा सा सकारात्मक पूर्वाग्रह का मुकाबला करने का एक तरीका है जो सीधे गोलाई देता है - आपके वित्तीय आवेदन को इसकी आवश्यकता हो सकती है।
यदि आप angularjs का उपयोग कर रहे हैं तो सरल समाधान निम्नानुसार है HTML टेम्पलेट बाइंडिंग में
{{val | number:0}}
यह घाटी को पूर्णांक में बदल देगा