পূর্ণসংখ্যা বিভাগ: আপনি কীভাবে ডাবল উত্পাদন করবেন?


249

এই কোড ব্লকের জন্য:

int num = 5;
int denom = 7;
double d = num / denom;

মান dহয় 0.0। কাস্টিং দ্বারা এটি কাজ করতে বাধ্য করা যেতে পারে:

double d = ((double) num) / denom;

তবে সঠিক doubleফল পাওয়ার জন্য অন্য উপায় আছে কি ? আমি আদিমদের ingালাই পছন্দ করি না, কে কী হতে পারে জানেন।



9
একটি 'int' ডাবলকে ingালাই নিরাপদ, আপনি যথার্থতার ক্ষতি ছাড়াই সর্বদা একই মান পাবেন।
পিটার লরি

1
আমি জানতে চাই যে নিম্নলিখিতটি বিভাগের জন্য সংকলক দ্বারা গৃহীত সঠিক পদক্ষেপগুলি রয়েছে: ১) নিক্ষেপকারী থেকে ভাসমান 2) নিক্ষিপ্ত ডোনম থেকে ভাসমান 2) ডেনম দ্বারা বিভাজক সংখ্যা। আমি ভুল হলে আমাকে জানাবেন।
মান্নই

উত্তর:


156
double num = 5;

এটি একটি castালাই এড়ানো। তবে আপনি দেখতে পাবেন কাস্ট রূপান্তরগুলি সুসংজ্ঞায়িত। আপনার অনুমান করার দরকার নেই, কেবল জেএলএস পরীক্ষা করুন । int থেকে ডাবল হ'ল বিস্তৃত রূপান্তর। §5.1.2 থেকে :

প্রসারিত আদিম রূপান্তরগুলি একটি সংখ্যার মানের সামগ্রিক পরিমাণের তথ্য হারাবে না।

[...]

ভাসমানের জন্য কোনও আন্ত বা একটি দীর্ঘ মানের রূপান্তর বা লম্বা মান দ্বিগুণ হওয়ার ফলে নির্ভুলতা হারাতে পারে - এটি হ'ল ফলটি মানটির কমপক্ষে কয়েকটি গুরুত্বপূর্ণ বিট হারিয়ে ফেলতে পারে। এই ক্ষেত্রে, ফলসিং-পয়েন্টের মানটি আইইইই 754 রাউন্ড-টু-নিকটতম মোড (§4.2.4) ব্যবহার করে পূর্ণসংখ্যার মানটির সঠিকভাবে গোলাকার সংস্করণ হবে ।

5 ডাবল হিসাবে ঠিক প্রকাশ করা যেতে পারে।


60
+1 টি। কাস্টিং থেকে ভয় পাওয়া বন্ধ করুন। এটি কীভাবে কাজ করে তা শিখুন। এটি সবই সংজ্ঞায়িত।
মার্ক পিটারস

1
@ ফ্যাব্রিকিওএইচ এটি প্রতিটি পরিস্থিতিতে কাজ করে এবং একই সাথে * 1.0 সমাধানে কাজ করে।
ভিট্রুভিয়াস

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

2
@ ফ্যাব্রিকিওএইচএইচ, 1.0এখনও গুণ করে ফলাফলের ধরণটি পরিবর্তন করে, অন্যভাবে। 'আমার কাছে নোংরা কোড বলে মনে হচ্ছে' আপনি কোন দৃশ্যে (গুলি) বিশ্বাস করেন না যে আপনি বিশ্বাস করেন যে গুণ করা 1.0আসলে আরও ভাল (বা কেন তা হতে পারে)।
ম্যাথু ফ্ল্যাশেন

4
@FabricioPH আপনি ওপি মিথ্যা বিশ্বাস (যেখানে আপনি বলতে "পরিবর্তনশীল ধরণ পরিবর্তন") অধীনে শ্রমজীবী করা যে করছেন বলে মনে হচ্ছে (double)numএকরকম পরিবর্তন num। এটি হয় না - এটি বিবৃতি প্রসঙ্গে একটি অস্থায়ী দ্বিগুণ তৈরি করে।
পল টমবলিন

100

আদিম কাস্টিংয়ে কী সমস্যা?

আপনি যদি কোনও কারণে কাস্ট করতে না চান তবে আপনি করতে পারেন

double d = num * 1.0 / denom;

63
... যা গুণনের আগে একটি অন্তর্নিহিত কাস্ট করে
অ্যালিস পুরসেল

2
বেশিরভাগ ক্ষেত্রে এটি অন্যান্য ভেরিয়েবলের ধরণের পরিবর্তনের চেয়ে ভাল।
Fabricio পিএইচ

3
@ ফ্যাব্রিকিওএইচএইচ-র কিছুই উদ্ধৃত করার কোনও উত্স না থাকলে কিছুই এটিকে সত্য বলে প্রস্তাব করে না।
ভিট্রুভিয়াস

1
@ সাপোশিঁতে আপনার অনুরূপ অন্যান্য মন্তব্যে জবাব দিয়েছেন
ফ্যাব্রিকিও পিএইচ

1
আপনি "ডি" পোস্টফিক্সও ব্যবহার করতে পারেন (একই অন্তর্ভুক্ত কাস্ট সম্পাদন করতে); - সুতরাং উদাহরণস্বরূপ:double d = num * 1D / denom;
BrainSlugs83

73

আমি আদিমদের ingালাই পছন্দ করি না, কে কী হতে পারে জানেন।

আপনার কাছে আদিম কাস্টিংয়ের অযৌক্তিক ভয় কেন? কিছুই খারাপ ঘটতে যখন আপনি একটি নিক্ষেপ করা হবে intএকটি করতে double। এটি কীভাবে কাজ করে তা সম্পর্কে আপনি যদি নিশ্চিত না হন তবে এটি জাভা ভাষা নির্দিষ্টকরণে সন্ধান করুন । একটি কাস্টিং intকরার doubleএকটি হল প্রসার আদিম রূপান্তর

আপনি সংখ্যার পরিবর্তে ডিনমিনেটর ingালাই করে অতিরিক্ত জোত বন্ধনীর হাত থেকে মুক্তি পেতে পারেন:

double d = num / (double) denom;

2
আপনিও করতে পারেন double d = (double) num / denom;... (ঠিক আছে, এটি অগ্রাধিকারের উপর নির্ভর করে)
ব্যবহারকারী 85421

27

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

double d = 5 / (double) 20; //cast to double, to do floating point calculations

নোট করুন যে ফলাফল ingালাই এটি করবে না

double d = (double)(5 / 20); //produces 0.0

17

ভাসমান পয়েন্ট ম্যাথ দিয়ে অপারেশনটি করতে বাধ্য করতে পূর্ণসংখ্যার দুটি / উভয় পূর্ণসংখ্যাকে ভাসান Cast অন্যথায় পূর্ণসংখ্যার ম্যাথ সর্বদা পছন্দ করা হয়। তাই:

1. double d = (double)5 / 20;
2. double v = (double)5 / (double) 20;
3. double v = 5 / (double) 20;

নোট করুন যে ফলাফল ingালাই এটি করবে না। কারণ প্রথম বিভাগটি অগ্রাধিকার নিয়ম অনুযায়ী করা হয়।

double d = (double)(5 / 20); //produces 0.0

আপনি যেমন ভাবছেন তেমন কাস্টিংয়ের ক্ষেত্রে কোনও সমস্যা আছে বলে আমি মনে করি না।


10

টাইপ কাস্টিং একমাত্র উপায়


একটি উত্পাদন doubleপূর্ণসংখ্যা থেকে division- ছাড়া অন্য কোন উপায় নেই ভোটদান (আপনি স্পষ্টভাবে করব না হতে পারে কিন্তু এটা ঘটতে হবে)।

এখন, বিভিন্নভাবে আমরা সুনির্দিষ্ট পেতে চেষ্টা করে দেখতে পারেন doubleমান (যেখানে numএবং denomহয় intপ্রকার, এবং অফ কোর্স ঢালাই সঙ্গে ) -

  1. সুস্পষ্ট ingালাই সহ:

    • double d = (double) num / denom;
    • double d = ((double) num) / denom;
    • double d = num / (double) denom;
    • double d = (double) num / (double) denom;

কিন্তু না double d = (double) (num / denom);

  1. অন্তর্নিহিত ingালাই সহ:

    • double d = num * 1.0 / denom;
    • double d = num / 1d / denom;
    • double d = ( num + 0.0 ) / denom;
    • double d = num; d /= denom;

কিন্তু না double d = num / denom * 1.0;
এবং নাdouble d = 0.0 + ( num / denom );


2

যেমন কিছু ব্যবহার করুন:

double step = 1d / 5;

(1 ডি দ্বিগুণ হওয়ার জন্য একটি কাস্ট)


5
1 ডি কাস্ট নয়, এটি কেবল একটি ঘোষণা।
সেফিয়ার টাং

0

আপনি অপারেশন মোড়ানো বিবেচনা করতে পারেন। উদাহরণ স্বরূপ:

class Utils
{
    public static double divide(int num, int denom) {
        return ((double) num) / denom;
    }
}

কাস্ট আপনি যা চান ঠিক তেমনটি করে কিনা তা আপনাকে সন্ধান করতে দেয় (কেবল একবার)। এটি আপনি যা চান তা অব্যাহত রাখে তা নিশ্চিত করার জন্য এই পদ্ধতিটিও পরীক্ষার বিষয় হতে পারে। আপনি বিভাজন সৃষ্টি করার জন্য কোন কৌশলটি ব্যবহার করেন তা গুরুত্বপূর্ণ নয় (যতক্ষণ না আপনি এখানে কোনও উত্তর ব্যবহার করতে পারেন), যতক্ষণ না এটি সঠিক ফলাফল দেয়। যেখানেই আপনার দুটি পূর্ণসংখ্যার বিভাজন করা দরকার, আপনি এখন কেবল কল করতে পারেন Utils::divideএবং বিশ্বাস করতে পারেন যে এটি সঠিক কাজ করে।



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