मैं जावा में इंट को लंबे समय तक कैसे परिवर्तित कर सकता हूं?


जवाबों:


371

जावा 8 में अपडेट किया गया:

Math.toIntExact(value);

मूल उत्तर:

सरल प्रकार की कास्टिंग इसे करना चाहिए:

long l = 100000;
int i = (int) l;

ध्यान दें, हालांकि, बड़ी संख्या (आमतौर पर की तुलना में बड़ी 2147483647और छोटी -2147483648) बिट्स में से कुछ खो देंगे और गलत तरीके से प्रतिनिधित्व करेंगे।

उदाहरण के लिए, के 2147483648रूप में प्रतिनिधित्व किया जाएगा -2147483648


पूर्णांकों की शुद्धता क्या है? o_O
khachik

3
@khachik मुझे लगता है कि परिशुद्धता 1. या हो सकता है :) निश्चित रूप से 42 है
extraneon

7
कास्टिंग का अर्थ वस्तुओं और आदिम प्रकारों के लिए अलग-अलग होता है। (int) l ६४-बिट पूर्णांक को ३२-बिट पूर्णांक के रूप में मानने की कोशिश नहीं करता है, यह वास्तव में एक ही ३२ लोअर ऑर्डर बिट्स के साथ ३२-बिट पूर्णांक देता है। वस्तुओं के साथ, आप एक अधिक विशिष्ट चाइल्ड क्लास में जाते हैं, लेकिन प्राइमिटवे प्रकारों के साथ, एक कास्ट वास्तव में एक कास्ट नहीं है, बल्कि एक रूपांतरण है।
dspyz 18

Int x = (int) ((((Long) Integer.MAX_INTEGER) +10); यदि इस स्थिति में रूपांतरण का पता नहीं लगता है कि x का अनुचित मूल्य है तो आपके पास समाधान नहीं है।
किशमिशस्तीन

Math.toIntExact () वास्तव में एक शानदार तरीका है। यह फेंकता है और अपवाद अगर मूल्य एक इंट में फिट करने के लिए बहुत बड़ा है। सलाह के लिये धन्यवाद।
जावा-आदी ३०१

182
Long x = 100L;
int y = x.intValue();


3
मैं कहूंगा कि यह सबसे अच्छा तरीका होगा।
सीमांत

इस तरह से और केवल मूल्य कास्टिंग के बीच क्या अंतर है? मुझे लगता है, कि intValue()बैकग्राउंड में यहां जो कुछ भी है, वह सभी कास्ट कर रहा है .. राइट?
टिम वाईमैन

1
नोट नोट करें। longयहाँ एक आदिम नहीं है। इसका संदर्भ प्रकार, Longजो सीधे एक आदिम के लिए डाल नहीं सकता है intint y = (int)x;एक निष्पादन फेंक देगा, लेकिन int y = (int)(long)xकाम करेगा। (इसका कारण
ऑटोबॉक्सिंग है

58

छोटे मूल्यों के लिए, कास्टिंग पर्याप्त है:

long l = 42;
int i = (int) l;

हालांकि, एक longएक से अधिक जानकारी रख सकते हैं int, तो यह पूरी तरह से कनवर्ट करने के लिए संभव नहीं है longकरने के लिए int, सामान्य स्थिति में। यदि आपके longपास एक संख्या से कम या उसके बराबर की संख्या Integer.MAX_VALUEकिसी भी जानकारी को खोए बिना कास्टिंग द्वारा परिवर्तित कर सकती है।

उदाहरण के लिए, निम्न नमूना कोड:

System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );

long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);

int y = (int) x;
System.out.println("int y=" + y);

मेरी मशीन पर निम्न आउटपुट का उत्पादन करता है:

largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648

नकारात्मक संकेत पर ध्यान दें y। क्योंकि xएक मान एक पूर्णांक से बड़ा होता है। MAX_VALUE, int yइसे धारण करने में असमर्थ था। इस मामले में यह नकारात्मक संख्याओं के आसपास लिपटे रहा।

यदि आप स्वयं इस मामले को संभालना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

if ( x > (long)Integer.MAX_VALUE ) {
    // x is too big to convert, throw an exception or something useful
}
else {
    y = (int)x;
}

यह सब सकारात्मक संख्या मानता है। नकारात्मक संख्या के लिए, MIN_VALUE'MAX_VALUE' के बजाय का उपयोग करें


तो एक उचित रूपांतरण यह पता लगाने के लिए होगा कि क्या रूपांतरण सुरक्षित है और अन्यथा एक अपवाद फेंक दें। तथ्य @Arerej Herich ने कहा कि अमरूद पुस्तकालय का सुझाव दिया।
किशमिशस्तीन

55

जावा 8 के बाद से आप उपयोग कर सकते हैं: Math.toIntExact (लंबे मूल्य)

देखें JavaDoc: Math.toIntExact

लंबे तर्क का मूल्य लौटाता है; एक अपवाद को फेंक देता है अगर मूल्य एक intflows है।

Math.toIntExactJDK 8 का स्रोत कोड :

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}

37

यदि अमरूद पुस्तकालय का उपयोग कर रहे हैं, तो वहाँ Ints.checkedCast(long)और Ints.saturatedCast(long)परिवर्तित longकरने के लिए तरीके हैं int


4
पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है
ग्रीनक

6
@Grekz कि ओपी तक है। मैं इस मामले में होगा। जब तक आपके पास अधिक निर्भरता वाले जार न होने का वास्तविक कारण न हो, तब तक अधिक निर्भरता वाले पहिये अधिक प्रबलित पहियों से बेहतर होते हैं।
djechlin

1
IMHO, यह उत्तर स्वीकृत एक की तुलना में बहुत बेहतर है, इसमें यह कभी अप्रत्याशित नहीं करता है।
मार्क स्लेटर

5
चूंकि मेरी परियोजना में पहले से ही उस जार को शामिल किया गया है, इसलिए इसका उपयोग करने के लिए एक नया सहायक लिखने की तुलना में अधिक लाभ होगा
Osify

24
long x = 3;
int y = (int) x;

लेकिन यह मानता है कि longएक के रूप में प्रतिनिधित्व किया जा सकता है int, तुम दोनों के बीच अंतर पता है?


6
यह जानना दिलचस्प है कि java.sun.com/docs/books/jls/third_edition/html/… (जावा भाषा विशेष) में बराबर 5.1.3 के अनुसार : इस तथ्य के बावजूद कि अतिप्रवाह, बाढ़ या जानकारी का अन्य नुकसान हो सकता है आदिम प्रकारों के बीच रूपांतरण कम होने के परिणामस्वरूप कभी भी रन-टाइम अपवाद (ions11) नहीं होता है।
एक्सट्रानसन

18

आप आदिम और कॉल के Longबजाय रैपर का उपयोग कर सकते हैंlong

Long.intValue()

Java7 intValue () डॉक्स

यह longएक में फिट करने के लिए तदनुसार मूल्य को गोल / छोटा करता है int


वर्तमान दस्तावेज़ से लिंक करने के लिए यह एक अच्छा विचार हो सकता है, साथ ही इस पर विस्तार - अनिवार्य रूप से, एक लंबे समय को इंट में परिवर्तित करते समय कुछ हद तक गोलाई हो सकती है।
मकोतो

2
Long.intValue () के जावा 7 कार्यान्वयन को देखते हुए, यह सिर्फ कास्टिंग है। कोई भी अंडर / ओवरफ्लो जाँच लागू नहीं की जाती है। तो कम से कम जावा 7 के माध्यम से, यह विकल्प सिर्फ: (int) someLong के बराबर है।
buzz3791

कम उभार क्यों? मुझे यह सबसे मूल्यवान उत्तर मिला
आनंद जी। कढ़ी

3

यदि प्रत्यक्ष कास्टिंग त्रुटि दिखाती है तो आप इसे इस तरह कर सकते हैं:

Long id = 100;
int int_id = (int) (id % 100000);

2

जावा में, एक लंबे समय से हस्ताक्षरित 64 बिट्स संख्या है, जिसका अर्थ है कि आप -9,223,372,036,854,775,808 और 9,223,372,036,854,775,807 (समावेशी) के बीच संख्याएँ संग्रहीत कर सकते हैं।

दूसरी ओर, एक इंट, 32 बिट्स नंबर पर हस्ताक्षरित है, जिसका अर्थ है कि आप नंबर को -2,147,483,648 और 2,147,483,647 (समावेशी) के बीच स्टोर कर सकते हैं।

इसलिए यदि आपका लॉन्ग किसी इंट के लिए अनुमत मूल्यों से बाहर है, तो आपको एक मूल्यवान रूपांतरण नहीं मिलेगा।

यहाँ आदिम जावा प्रकार के आकारों के बारे में विवरण:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


1
जिस समय मैंने इसे देखा, उस समय इस प्रश्न का उत्तर पहले से ही था, लेकिन रूपांतरण की सीमाओं के विषय को नहीं समझाया गया था। जो मैंने तब किया था। अगर आपको लगता है कि "bla bla bla", इसका मतलब केवल यह है कि आप किसी प्रकार के जीनियस हैं, जो इस तरह की चीज के बिना जा सकते हैं, लेकिन हमारे लिए, केवल मनुष्य, एक स्पष्टीकरण उपयोगी हो सकता है। आपके "इनपुट" के लिए धन्यवाद ...
एलेक्सिस डुफ्रेनॉय

1

में जावा 8 मैं निम्नलिखित तरीके से करते हैं

long l = 100L;
int i = Math.toIntExact(l);

ArithmaticExceptionयदि longमान की सीमा से अधिक है, तो यह विधि फेंकता है int। इस प्रकार मैं डेटा हानि से सुरक्षित हूं।


0

यदि आप एक सुरक्षित रूपांतरण करना चाहते हैं और लैम्ब्डा अभिव्यक्ति के साथ Java8 का उपयोग करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)

आप इसे घोषित करने का मतलब है Function<Long,Integer> function =?
Scratte

-1

लंबी x = 3120L; // किसी भी लंबे मान int z = x.intValue () को लें; // आप उसी तरह से डबल को भी इंट में कन्वर्ट कर सकते हैं

अगर आप सीधे गुप्त जरूरत है तो

longvalue.intvalue ();


यह गलत है, 3.120 लंबा नहीं है, यह एक डबल या फ्लोटिंग पॉइंट नंबर है।
जॉर्ज जेवियर


-7

वसंत में, एक लंबे समय को अंतर में बदलने का एक कठोर तरीका है

न केवल lnog इंट में परिवर्तित हो सकता है, किसी भी प्रकार की क्लास फैली हुई संख्या सामान्य रूप से अन्य नंबर प्रकार में परिवर्तित हो सकती है, यहां मैं आपको दिखाऊंगा कि लंबे समय को इंट, अन्य प्रकार के विपरीत में कैसे परिवर्तित किया जाए।

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

इंट में लंबे समय तक परिवर्तित करें


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