জাভাতে ডাবল টু পূর্ণসংখ্যা কাস্ট করুন


347

কাস্ট java.lang.Doubleকরার কোনও উপায় java.lang.Integer?

এটি একটি ব্যতিক্রম ছোঁড়ে

"java.lang.ClassCastException: java.lang. java.lang.Integer এর সাথে বেমানান ডাবল"

উত্তর:


463

Doubleএকটি নয় Integer, সুতরাং castালাই কাজ করবে না। Double ক্লাস এবং double আদিম মধ্যে পার্থক্য নোট করুন । এছাড়াও নোট করুন যে একটি Doubleএকটি Number, তাই এর পদ্ধতি রয়েছে intValue যা আপনি আদিম হিসাবে মান পেতে ব্যবহার করতে পারেন int


2
কাস্ট না করা ঠিক আছে। উদাহরণস্বরূপ, আমাকে 13.22222 নয় বরং 13 এর দ্বিগুণ থেকে পূর্ণসংখ্যার অবজেক্টটি পেতে হবে।
4lex1v

181
ঠিক intValue()তখন ফোন করুন ।
hvgotcodes

6
নাল হ্যান্ডেল করতে ভুলবেন না
পিমলোটক

13
নোট যে এই নিছক ডাবল এর পূর্ণসংখ্যা অংশ ফেরৎ, তাই 13.666667 বা এমনকি 13.9 স্বরূপ, আপনি 13, না 14. পাবেন আপনি যদি চান নিকটতম পূর্ণসংখ্যা, আমার উত্তর উল্লেখ করুন: stackoverflow.com/a/24816336/1450294
মাইকেল শ্যাপার

2
যদি আপনি বাস্তবায়ন তাকান intValue(), এটা ঠিক কাস্ট doubleএকটি থেকে int
carlo.marinangeli

564

আপনার মেথডভ্যালু () এর মতো পদ্ধতিটি ব্যবহার করে স্পষ্টভাবে ইনট মান পেতে হবে:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

অথবা

double d = 5.25;
int i = (int) d;

67
ধন্যবাদ. খুব পরিস্কার. আমার কাছে গৃহীত উত্তরটি মূর্খ প্রশ্ন জিজ্ঞাসা করার জন্য বদনাম করার মতো মনে হয়। তবে আপনার উত্তরটি খুব উদার।
বুধিকা আরিয়ারত্ন

2
যখন দ্বিগুণ মান পূর্ণসংখ্যা ব্যাপ্তির বাইরে থাকে তখন কী ঘটে? (2 ^ 33 এর মতো)
নিকদেপেন

5
যে কোনও দ্বিগুণ মান> 2^31 - 1 (Integer.MAX_VALUE)উপচে পড়বে।
অনুভা

3
এবং যাইহোক, যখন ডাবল থেকে ইনট পর্যন্ত কাস্ট করা হয়, এটি কেবল ধনাত্মক ও নেতিবাচক উভয় সংখ্যার জন্য পূর্ণসংখ্যার অংশ রাখে এবং বৃত্তাকার সম্পর্কে কোনও চিন্তা করে না। যেমন 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
এরিক ওয়াং

51

আমি মনে করি ভুল উত্তরগুলি covering াকাই এবং এর পিছনে যুক্তি না দিয়ে অন্যান্য উত্তরগুলি বোঝা অসম্ভব ।

আপনি সরাসরি Integerকোনও Doubleবস্তুতে কাস্ট করতে পারবেন না । এছাড়াও Doubleএবং Integerঅপরিবর্তনীয় বস্তু, তাই আপনি এগুলি কোনওভাবেই সংশোধন করতে পারবেন না।

প্রতিটি সাংখ্যিক শ্রেণীর একটি প্রাথমিক বিকল্প রয়েছে ( Doubleবনাম double, Integerবনাম int, ...)। নোট করুন যে এই আদিমগুলি একটি ছোট হাতের অক্ষর দিয়ে শুরু হয় (যেমন int)। এটি আমাদের জানায় যে তারা শ্রেণি / অবজেক্ট নয়। যার অর্থ এইও যে তাদের কোনও পদ্ধতি নেই। বিপরীতে, ক্লাস (উদাঃ Integer) এই আদিমগুলির চারপাশে বাক্স / মোড়কের মতো কাজ করে, যা তাদেরকে বস্তুর মতো ব্যবহার করা সম্ভব করে।

কৌশল:

একটিতে রূপান্তর Doubleকরতে Integerআপনাকে এই কৌশলটি অনুসরণ করতে হবে:

  1. Doubleবস্তুকে আদিম রূপান্তর করুন double। (= "আনবক্সিং")
  2. আদিম রূপান্তর করুন doubleএকটি আদিম থেকে int। (= "ingালাই")
  3. আদিমটিকে intকোনও Integerবস্তুর কাছে ফিরিয়ে আনুন । (= "বক্সিং")

কোডে:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

আসলে একটি শর্টকাট আছে। আপনি Doubleসরাসরি কোনও আদিম থেকে আনবক্স করতে পারবেন int। এইভাবে, আপনি সম্পূর্ণ পদক্ষেপ 2 এড়িয়ে যেতে পারেন।

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

pitfalls:

তবে উপরে অনেকগুলি বিষয় রয়েছে যা উপরের কোডের আওতায় নেই। উপরের কোডটি নাল-নিরাপদ নয়।

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

এখন এটি বেশিরভাগ মানের জন্য কাজ করে। তবে পূর্ণসংখ্যার একটি খুব ছোট পরিসর (কমপক্ষে / MAX মান) একটি তুলনায় আছে Double। তার উপরে, ডাবলগুলি "বিশেষ মানগুলি" ধরে রাখতে পারে, এটি পূর্ণসংখ্যাগুলি পারে না:

  • 1/0 = + অনন্ত
  • -1/0 = অন্তঃসত্তা
  • 0/0 = অপরিশোধিত (এনএএন)

সুতরাং, প্রয়োগের উপর নির্ভর করে, আপনি বাজে ব্যতিক্রমগুলি এড়াতে কিছু ফিল্টারিং যুক্ত করতে চাইতে পারেন।

তারপরে, পরবর্তী ত্রুটিটি গোলটি কৌশল ing ডিফল্ট হিসাবে জাভা সর্বদা ডাউন হবে। বৃত্তাকার ডাউন সমস্ত প্রোগ্রামিং ভাষায় নিখুঁত ধারণা তৈরি করে। মূলত জাভা কিছু বাইট ফেলে দিচ্ছে। আর্থিক অ্যাপ্লিকেশনগুলিতে আপনি অবশ্যই হাফ-আপ রাউন্ডিং ব্যবহার করতে চান (যেমন: round(0.5) = 1এবং round(0.4) = 0)।

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

আত্ম- (UN) বক্সিং

আপনি এতে অটো- (আন) বক্সিং ব্যবহার করার জন্য প্রলুব্ধ হতে পারেন , তবে আমি তা করব না। আপনি যদি ইতিমধ্যে এখন আটকে থাকেন, তবে পরবর্তী উদাহরণগুলিও তা স্পষ্ট নয়। আপনি যদি অটো- (আন) বক্সিংয়ের অভ্যন্তরীণ কাজগুলি বুঝতে না পারেন তবে দয়া করে এটি ব্যবহার করবেন না।

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

আমি অনুমান করি যে নিম্নলিখিতগুলি একটি আশ্চর্য হওয়া উচিত নয়। তবে যদি এটি হয় তবে আপনি জাভাতে কাস্টিং সম্পর্কে কিছু নিবন্ধ পড়তে চাইতে পারেন।

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

মানটি পছন্দ করুন:

এছাড়াও, new Integer()কনস্ট্রাক্টর ব্যবহার করার প্রলোভন করবেন না (যেমন কিছু অন্যান্য উত্তর প্রস্তাব দেয়)। valueOf()কারণ তারা ক্যাশে ব্যবহার পদ্ধতি ভাল হয়। এই পদ্ধতিগুলি ব্যবহার করা ভাল অভ্যাস, কারণ সময়ে সময়ে তারা আপনাকে কিছু স্মৃতি সাশ্রয় করবে।

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

1
এটি আমার মতে সেরা উত্তর
থোর

39

আমি তিনটি সম্ভাবনা দেখতে পাচ্ছি। প্রথম দুটি অঙ্কগুলি কেটে ফেলেছে, শেষেরটি একটি নিকটতম পূর্ণসংখ্যার রাউন্ডে।

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10

21
আপনি যদি কোনও প্রিমিটিভ ইন্টে ফলাফল সংরক্ষণ করতে চলেছেন তবে পূর্ণসংখ্যা.ভালিউওয়ের কোনও প্রয়োজন নেই। আপনার কোড জাভাটিকে একটি অপ্রয়োজনীয় বাক্স এবং আনবক্স করতে বাধ্য করে forces
বিভিডিবি


23

নিশ্চয় সহজ উপায় ব্যবহার করা intValue()। তবে এটি কেবল পূর্ণসংখ্যার অংশটি দেয়; এটি কোনও রাউন্ডিং করে না। আপনি যদি দ্বিগুণ মানের নিকটতম পূর্ণসংখ্যা চান তবে আপনার এটি করতে হবে:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

এবং নাল কেস ভুলবেন না:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() তুলনামূলক কৃপায় অসীম হাঁসের কেস যেমন অনন্ত এবং NaN পরিচালনা করে।


2
আপনি যদি ম্যাথ.গ্রাউন্ড রেজাল্ট ইন্টে কাস্ট করেন তবে ইন্টিজার.ওয়ালুওফের দরকার হয় কেন?
ইরান এইচ।

@ ইরান: জাভা 1.5 হিসাবে, আপনি সম্ভবত না — অটোবক্সিং মানে কোড সম্ভবত একইভাবে কাজ শেষ হয়। তবে আমি মনে করি এই কোডগুলি এমন লোকদের জন্য আরও স্পষ্ট যাঁরা এখনও অবধি অবধি বস্তু এবং আদিম পদার্থ গ্রহণ করেন নি।
মাইকেল শ্যাপার

যার এই উত্তরটি নিচে ভোট দিয়েছেন: আপনি কেন সম্প্রদায়টিকে ব্যাখ্যা করলে আপনি সম্প্রদায়কে আরও অনেক বেশি সহায়তা করবেন এবং এটি আপনার পক্ষে কেন কাজ করে না তা খুঁজে পেতেও আপনাকে সহায়তা করতে পারে। ওটিওএইচ, ব্যাখ্যা ছাড়াই ডাউন-ভোটিং সবার জন্য অসহায়, এবং এটি কাপুরুষ হিসাবে দেখা দেয়।
মাইকেল শ্যাপার 23 '50



7
Double d = 100.00;
Integer i = d.intValue();

এটির সাথে এটি যুক্ত করা উচিত যে এটি অটোবক্সিংয়ের সাথে কাজ করে।

অন্যথায়, আপনি একটি int (প্রাথমিক) পাবেন এবং তারপরে সেখান থেকে একটি পূর্ণসংখ্যা পেতে পারেন:

Integer i = new Integer(d.intValue());

2
new Integer(int)পরিবর্তে ব্যবহার করবেন না , এর মধ্যে Integer.valueOf(int)ছোট ছোট পূর্ণসংখ্যার জন্য ক্যাশে রয়েছে যেমন।
বিভিডিবি


4

আপনি "সংকীর্ণ বা সুস্পষ্ট ধরণের রূপান্তর" ব্যবহার করে এটি করতে পারেন, ডাবল লম্বা → ইন্ট। আমি এটি কাজ করবে আশা করি।

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: এটি ডাবল হিসাবে সমস্ত দশমিক মান আছে এবং বাম দিকে কিছুই দেবে না। 0.58 এর ক্ষেত্রে এটি এটিকে নীচে 0 এ সংকুচিত করবে তবে অন্যদের জন্য এটি যাদু করবে।



3

ডাবল এবং পূর্ণসংখ্যা যথাক্রমে ডাবল এবং ইন্টের জন্য জাভা আদিমদের জন্য মোড়কের ক্লাস। আপনি এইগুলির মধ্যে কাস্ট করতে পারেন তবে আপনি ভাসমান পয়েন্টটি হারাবেন। এটি হ'ল, 5.4 ইন্টিতে কাস্ট করা 5 হবে 5. আপনি যদি এটি পিছনে ফেলে দেন তবে এটি 5.0 হবে।


0

কেবল ডাবল এর ইনটালিউ পদ্ধতিটি ব্যবহার করুন

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
অন্যান্য উত্তরের পুনরাবৃত্তি বলে মনে হচ্ছে।
পং

0

doubleNumber.intValue();পদ্ধতিটি ব্যবহার করুন ।


2
অন্যান্য উত্তরের পুনরাবৃত্তি বলে মনে হচ্ছে।
পং

-1

স্মৃতিশক্তি দক্ষ, কারণ এটি ইতিমধ্যে তৈরি করা দ্বিগুণ ইভেন্টটি ভাগ করবে।

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

এর কোন কারণ আছে Math.floor(...)? intValue()সর্বদা যাই হোক না কেন মেঝে।
বিডিডিবি

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