আমি জাভাতে কীভাবে একটি দীর্ঘকে ইনটকে রূপান্তর করতে পারি?


উত্তর:


371

জাভা 8 এ আপডেট হয়েছে:

Math.toIntExact(value);

আসল উত্তর:

সাধারণ ধরণের ingালাই এটি করা উচিত:

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

দ্রষ্টব্য, তবে, যে বৃহত সংখ্যা (সাধারণত এর চেয়ে বড় 2147483647এবং এর চেয়ে ছোট -2147483648) কিছু বিট হারাবে এবং ভুলভাবে উপস্থাপন করা হবে।

উদাহরণস্বরূপ, 2147483648হিসাবে প্রতিনিধিত্ব করা হবে -2147483648


পূর্ণসংখ্যার নির্ভুলতা কী? o_O
খচিক

3
@ খাচিক আমি মনে করি যথার্থতা 1। বা সম্ভবত 42 টি :)
এক্সেরেনন

7
Objectsালাইয়ের বস্তুর জন্য এবং আদিম ধরণের বিভিন্ন অর্থ রয়েছে। (ইনট) আমি কোনও 64৪-বিট পূর্ণসংখ্যাকে 32-বিট পূর্ণসংখ্যার হিসাবে বিবেচনা করার চেষ্টা করি না, এটি একই একই 32 লোয়ার অর্ডার বিটের সাহায্যে একটি পৃথক 32-বিট পূর্ণসংখ্যা ফেরত দেয়। বস্তুগুলির সাহায্যে আপনি আরও নির্দিষ্ট শিশু শ্রেণিতে কাস্ট করেন তবে প্রাথমিক প্রকারের সাথে একটি কাস্ট সত্যই কাস্ট নয়, রূপান্তর হয়।
dspyz

ইন্ট x = (ইনট) ((দীর্ঘ) পূর্ণসংখ্যা যদি কোনও রূপান্তর এই ক্ষেত্রে সনাক্ত না করে যে এক্সটির একটি অনুচিত মান রয়েছে তবে আপনার কাছে সমাধান নেই।
কিসমেকোস্টিন

ম্যাথ.টোইন্টেক্স্যাক্ট () আসলে একটি দুর্দান্ত পদ্ধতি। যদি মানটি খুব বেশি বড় হয় তবে এটি ছুঁড়ে দেয় এবং ব্যতিক্রম। পরামর্শের জন্য ধন্যবাদ.
java-addict301

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


3
আমি বলব এটি সেরা উপায় হবে।
সিমেন্ট

এই উপায়টির মধ্যে পার্থক্য কী এবং কেবল কেবল মূল্য দেওয়ার জন্য? আমি মনে করি, যে intValue()এখানে ব্যাকগ্রাউন্ডে যা করে তা মান isালাই করছে?
টিম ওয়াইমান

1
প্রকারগুলি নোট করুন। এটি longএখানে আদিম নয় । এটি উল্লেখযোগ্য টাইপ Longযা সরাসরি কোনও আদিমকে কাস্ট করতে পারে না intint y = (int)x;একটি ফাঁসির int y = (int)(long)xকাজ ছুড়ে ফেলবে তবে কাজ করবে। (কারণ অটোবক্সিং)
akop

58

ছোট মানগুলির জন্য, ingালাই যথেষ্ট:

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

তবে longএকটি চেয়ে আরও তথ্যের ধরে রাখতে পারেন int, তাই এটি পুরোপুরি থেকে রূপান্তর করা সম্ভব নয় longথেকে int, সাধারণ ক্ষেত্রে। যদি এর longচেয়ে কম বা সমান সংখ্যক হোল্ড থাকে তবে Integer.MAX_VALUEকোনও তথ্য না হারিয়ে losingালাই করে এটি রূপান্তর করতে পারে।

উদাহরণস্বরূপ, নিম্নলিখিত নমুনা কোড:

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পূর্ণসংখ্যার চেয়ে বড় একটি মান int yধরেছে MA MAX_VALUE, এটি ধরে রাখতে অক্ষম। এই ক্ষেত্রে এটি নেতিবাচক সংখ্যার চারপাশে মোড়ানো pped

আপনি যদি এই মামলাটি নিজে পরিচালনা করতে চান তবে আপনি এর মতো কিছু করতে পারেন:

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' এর পরিবর্তে ব্যবহার করুন


সুতরাং রূপান্তরটি নিরাপদ কিনা তা সনাক্ত করা এবং অন্যথায় ব্যতিক্রম নিক্ষেপ করা একটি উপযুক্ত রূপান্তর। @ আন্ড্রেজ হেরিচ দ্বারা যুক্ত বিবরণ যা পেয়ারা গ্রন্থাগারের পরামর্শ দেয়।
কিসমেকোস্টিন

55

জাভা 8 যেহেতু আপনি ব্যবহার করতে পারেন: Math.toIntExact (দীর্ঘ মূল্য)

জাভাডোক: ম্যাথ টু আইন্টেক্স্যাক্ট দেখুন

দীর্ঘ আর্গুমেন্টের মান প্রদান করে; যদি মানটি কোনও ইনট্রোভার হয় তবে একটি ব্যতিক্রম ছোঁড়া।

Math.toIntExactজেডিকে 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
গ্রন্থাগারগুলি ব্যবহার করার দরকার নেই
19-23-28 এ গ্রেজ

6
পছন্দ করুন আমি এই ক্ষেত্রে হবে। আপনার কাছে বেশি নির্ভরতার জার না রাখার আসল কারণ না থাকলে আরও পুনর্নবীকরণিত চাকার চেয়ে আরও নির্ভরশীলতা জারগুলি ভাল।
djechlin

1
আইএমএইচও, এই উত্তরটি গৃহীত উত্তরটির চেয়ে অনেক ভাল, কারণ এটি কখনই অপ্রত্যাশিত কিছু করে না।
মার্ক স্লেটার

5
যেহেতু আমার প্রকল্পটিতে ইতিমধ্যে সেই জারটি অন্তর্ভুক্ত রয়েছে তাই নতুন সহায়ক লেখার চেয়ে এটি ব্যবহার করা আরও বেশি সুবিধাজনক হবে
ওসাইফ

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

কিন্তু এটি ধরে নিয়েছে যে longএকটি হিসাবে উপস্থাপিত হতে পারে int, আপনি কি উভয়ের মধ্যে পার্থক্য জানেন?


6
জেনে রাখা আগ্রহজনক যে java.sun.com/docs/books/jls/third_edition/html/… (জাভা ল্যাঙ্গুয়েজ স্পেস) - এর 5.5.3 অনুচ্ছেদে অনুসারে : ওভারফ্লো, আন্ডারফ্লো বা তথ্য নষ্ট হওয়া সত্ত্বেও ঘটে, আদিম ধরণের মধ্যে সংকীর্ণ রূপান্তরগুলি কখনই রান-টাইম ব্যতিক্রম (§11) এর ফলশ্রুতি দেয় না।
এক্সেরেনন

18

আপনি আদিম এবং কলের Longপরিবর্তে মোড়ক ব্যবহার করতে পারেনlong

Long.intValue()

জাভা 7 ইন্টভ্যালু () ডক্স

এটি longমান অনুসারে গোল করে / কেটে দেয় int


বর্তমান ডকুমেন্টেশনের সাথে লিঙ্ক করা ভাল ধারণা হতে পারে, পাশাপাশি এটিতে প্রসারিত - অনিবার্যভাবে, দীর্ঘকে কোনও আন্তঃরূপে রূপান্তর করার সময় কিছুটা ডিগ্রি গোল হতে পারে।
মাকোটো

2
Long.intValue () এর জাভা 7 বাস্তবায়নের দিকে তাকানো, এটি কেবল .ালাই। কোনও আন্ডার / ওভারফ্লো চেকিং কার্যকর করা হয়নি। অন্তত জাভা 7 এর মাধ্যমে, এই বিকল্পটি কেবল: (পূর্ববর্তী) কিছুটা দীর্ঘ সমান।
বুজ 3791

কেন কম upvotes? আমি এটি সবচেয়ে মূল্যবান উত্তর খুঁজে পেয়েছি
আনন্দ জে। কধি


2

জাভাতে, দীর্ঘ একটি স্বাক্ষরিত b৪ বিট নম্বর, যার অর্থ আপনি -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
আমি যখন দেখেছি তখনই প্রশ্নের উত্তর ইতিমধ্যে দেওয়া হয়েছিল, তবে রূপান্তরটির সীমাটির বিষয় ব্যাখ্যা করা হয়নি। যা আমি তখন করেছিলাম। আপনি যদি এটি "ব্লে ব্লে ব্লে" মনে করেন তবে এর অর্থ শুধুমাত্র আপনি একরকম প্রতিভা যাঁরা এই ধরণের জিনিস ছাড়াই যেতে পারেন, তবে আমাদের পক্ষে, নিছক মানুষ, একটি ব্যাখ্যা কার্যকর হতে পারে। আপনার "ইনপুট" এর জন্য আপনাকে ধন্যবাদ ...
অ্যালেক্সিস ডুফরনয়

1

ইন জাভা 8 আমি নিম্নলিখিত ভাবে না

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

মানটির পরিসীমা ছাড়িয়ে ArithmaticExceptionগেলে এই পদ্ধতিটি ছুড়ে ফেলে । সুতরাং আমি ডেটা ক্ষতি থেকে নিরাপদ।longint


0

আপনি যদি একটি নিরাপদ রূপান্তর করতে চান এবং জাভা 8 এর ব্যবহার লম্বা এক্সপ্রেশন সহ উপভোগ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

আপনি এটির মত ঘোষণার অর্থ Function<Long,Integer> function =?
স্ক্র্যাটে

-1

দীর্ঘ x = 3120L; // যেকোনো দীর্ঘ মান গ্রহণ করুন z = x.intValue (); // আপনি একই পদ্ধতিতে ডাবল ইনটকে রূপান্তর করতে পারেন

আপনি যদি সরাসরি গোপন প্রয়োজন হয়

longvalue.intvalue ();


এটি ভুল, 3.120 একটি দীর্ঘ নয়, এটি একটি ডাবল বা ভাসমান পয়েন্ট সংখ্যা।
জর্জ জাভিয়ার 16


-7

বসন্তে, একটি দীর্ঘ থেকে ইনটকে রূপান্তর করার জন্য একটি কঠোর উপায় রয়েছে

শুধু লনোগ ইন্টে রূপান্তর করতে পারে না, কোনও ধরণের শ্রেণি বিস্তৃত হয় তবে সংখ্যাটি সাধারণভাবে অন্যান্য সংখ্যা প্রকারে রূপান্তর করতে পারে, এখানে আমি আপনাকে দেখাব যে কীভাবে একটি দীর্ঘকে ইনট, অন্য ধরণের বিপরীতে রূপান্তর করতে হয়।

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

দীর্ঘ থেকে ইনট রূপান্তর


6
স্প্রিং জাভা হতে পারে তবে জাভা স্প্রিং নয়। "জাভাতে, আছে" একটি মিথ্যা বক্তব্য।
গর্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.