আন্ত বিভাগ: কেন 1/3 == 0 ফলাফল?


107

আমি এই কোডটি লিখছিলাম:

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

ফলাফল 0 হয়। এটি কেন হয় এবং আমি কীভাবে এই সমস্যাটি সমাধান করব?

উত্তর:


147

দুটি অপারেন্ড (1 এবং 3) পূর্ণসংখ্যা, সুতরাং পূর্ণসংখ্যার গাণিতিক (এখানে বিভাগ) ব্যবহৃত হয়। ফলাফলের পরিবর্তনশীলটিকে দ্বিগুণ হিসাবে ঘোষণা করা কেবল বিভাগের পরে একটি অন্তর্নিহিত রূপান্তর ঘটায় ।

অবশ্যই পূর্ণসংখ্যা বিভাগ শূন্যের দিকে গোল করে বিভাগের আসল ফলাফল দেয় returns ফলাফলটি 0.333...এখানে 0 এর নিচে বৃত্তাকার হয়। (নোট করুন যে প্রসেসরটি আসলে কোনও রাউন্ডিং করে না, তবে আপনি এখনও সেভাবে এটি ভাবতে পারেন))

এছাড়াও, নোট করুন যে উভয় অপারেন্ড (সংখ্যা) যদি ভাসমান হিসাবে দেওয়া হয়; 3.0.০ এবং ১.০ বা এমনকি প্রথমটি , তারপরে ভাসমান-পয়েন্ট গাণিতিক ব্যবহার করা হয়, আপনাকে দেওয়া 0.333...


33
+1 এবং এটি সর্বদা গোল হয়ে যায়। int i = .99999999সংখ্যায় 0. সেট করে More
বায়রন হুইললক

37
এটি শূন্যের চেয়ে বড় মানের জন্য "নীচের দিকে" যা "শূন্যের দিকে" গোল করে। (+0.9 0-এ গোল হয়, -0.9 এছাড়াও 0-এ গোল হয়)
অ্যাড্রিয়ান স্মিথ

@ বায়রন: হ্যাঁ, ঠিক আমি বিশ্বাস করি না যে প্রসেসরটি আসলে কোনও রাউন্ডিং করে, যেহেতু বিভাগটি খুব আলাদাভাবে প্রয়োগ করা হয়, তবে এটি সেভাবে ভাবা সহজ।
নলডোরিন

15
না, গোল নয়: ছাঁটাই
বাসিল বার্ক

3
@BasilBourque জাভা পরিভাষা, রাউন্ডইংDOWN শূন্য দিকে হয়। বৃত্তাকারটি FLOORনেতিবাচক অসীমের দিকে।
অ্যান্ড্রেয়াস

23

1/3 উভয় পক্ষই পূর্ণসংখ্যা হিসাবে পূর্ণসংখ্যা বিভাগ ব্যবহার করে।

আপনার মধ্যে অন্তত একটি হতে হবে floatবা হতে হবে double

আপনি যদি আপনার প্রশ্নের মতো উত্স কোডটিতে মানগুলি প্রবেশ করিয়ে থাকেন তবে আপনি এটি করতে পারেন 1.0/3; 1.0একটি ডবল হয়।

আপনি অন্য কোথাও থেকে মানগুলি করুন আপনি ব্যবহার করতে পারেন (double)ঘুরে intএকটি মধ্যে double

int x = ...;
int y = ...;
double value = ((double) x) / y;

10

স্পষ্টভাবে এটি হিসাবে কাস্ট double

double g = 1.0/3.0

এটি ঘটায় কারণ জাভা পূর্ণসংখ্যা বিভাগ অপারেশনটি ব্যবহার করে 1এবং 3যেহেতু আপনি তাদের পূর্ণসংখ্যার ধ্রুবক হিসাবে প্রবেশ করেছেন।


2

আপনার ব্যবহার করা উচিত

double g=1.0/3;

অথবা

double g=1/3.0;

পূর্ণসংখ্যা বিভাগ পূর্ণসংখ্যা প্রদান করে।


2

কারণ আপনি পূর্ণসংখ্যা বিভাগ করছেন।

@ নলডোরিন যেমন বলেছেন, উভয় অপারেটর যদি পূর্ণসংখ্যা হয় তবে পূর্ণসংখ্যা বিভাগটি ব্যবহৃত হয়।

০.৩৩৩৩৩৩৩৩ ফলাফলটি পূর্ণসংখ্যা হিসাবে প্রতিনিধিত্ব করতে পারে না, সুতরাং ফলাফলের জন্য কেবল পূর্ণসংখ্যার অংশ (0) বরাদ্দ করা হয়।

অপারেটরগুলির মধ্যে যদি কোনও একজন double/ হয় floatতবে ভাসমান পয়েন্ট গণিতটি সংঘটিত হবে। তবে আপনি যদি এটি করেন তবে আপনার একই সমস্যা হবে:

int n = 1.0 / 3.0;

1

কারণ এটি 1 এবং 3টিকে পূর্ণসংখ্যার হিসাবে বিবেচনা করে, সুতরাং ফলাফলটিকে 0 এর চেয়ে কম করে, যাতে এটি একটি পূর্ণসংখ্যা হয়।

আপনি যে ফলাফলটি সন্ধান করছেন তা পেতে, স্পষ্টভাবে জাভাটিকে বলুন যে সংখ্যাগুলি এর মতো দ্বিগুণ:

double g = 1.0/3.0;

1

1 টি তৈরি করুন এবং একটি ফ্লোট বিভাগ ব্যবহার করা হবে

public static void main(String d[]){
    double g=1f/3;
    System.out.printf("%.2f",g);
}

1

জাভাতে রূপান্তরটি বেশ সহজ তবে কিছুটা বোঝার দরকার। পূর্ণসংখ্যার ক্রিয়াকলাপগুলির জন্য জেএলএস-তে ব্যাখ্যা হিসাবে :

যদি শিফট অপারেটর ব্যতীত কোনও পূর্ণসংখ্যার অপারেটরের টাইপ কমপক্ষে একটি অপারেন্ড থাকে তবে 64৪-বিট নির্ভুলতা ব্যবহার করে অপারেশনটি করা হয়, এবং সংখ্যাসূচক অপারেটরের ফলাফলটি টাইপ দীর্ঘ। অন্য অপারেন্ডটি দীর্ঘ না হলে সংখ্যার প্রচার (§5.6) দ্বারা দীর্ঘ টাইপ করতে প্রথমে এটি প্রশস্ত করা হয় (.15.1.5)।

এবং একটি উদাহরণ সর্বদা জেএলএস অনুবাদ করার সর্বোত্তম উপায়;)

int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)

অন্যথায়, অপারেশনটি 32-বিট নির্ভুলতা ব্যবহার করে পরিচালিত হয় এবং সংখ্যার অপারেটরের ফলাফলটি টাইপ ইন্টের হয়। যদি উভয় অপরেন্ড কোনও অন্তর্নির্মিত না হয় তবে এটি প্রথমে সংখ্যার প্রচারের মাধ্যমে টাইপ করতে প্রসারিত হবে।

short + int -> int + int -> int

Eclipse ব্যবহার করে একটি ছোট উদাহরণটি দেখানোর জন্য যে দুটি shortএর যোগও এত সহজ হবে না:

short s = 1;
s = s + s; <- Compiling error

//possible loss of precision
//  required: short
//  found:    int

এটিতে নির্ভুলতার সম্ভাব্য ক্ষতি সহ একটি কাস্টিং প্রয়োজন।

একই ভাসমান পয়েন্ট অপারেটরদের ক্ষেত্রে সত্য

যদি সংখ্যার অপারেটরের কমপক্ষে অপারেটরগুলির মধ্যে একটি টাইপ দ্বিগুণ হয়, তবে 64৪-বিট ভাসমান-পয়েন্ট পাটিগণিত ব্যবহার করে অপারেশনটি করা হয়, এবং সংখ্যাসূচক অপারেটরের ফলাফল টাইপের দ্বিগুণ একটি মান। অন্য অপারেন্ডটি যদি ডাবল না হয় তবে প্রথমে সংখ্যার প্রচার (§5.6) দ্বারা ডাবল টাইপ করতে এটি প্রশস্ত করা হবে (.15.1.5)।

সুতরাং পদোন্নতিটি ভাসমানটিতে দ্বিগুণ হয়ে গেছে।

এবং পূর্ণসংখ্যা এবং ভাসমান মান উভয়ের মিশ্রণ ফলশ্রুতিতে প্রাপ্ত মান হিসাবে ফল হিসাবে বলে

যদি বাইনারি অপারেটরের কমপক্ষে অপারেটরগুলির একটি ফ্লোটিং-পয়েন্ট টাইপের হয় তবে অপারেশনটি একটি ভাসমান-পয়েন্ট অপারেশন, অন্যটি অবিচ্ছেদ্য হলেও even

এটি বাইনারি অপারেটরদের ক্ষেত্রে সত্য তবে "এসাইনমেন্ট অপারেটর" পছন্দ নয় +=

এটি প্রমাণ করার জন্য একটি সাধারণ কাজের উদাহরণই যথেষ্ট

int i = 1;
i += 1.5f;

কারণটি হ'ল এখানে একটি নিখুঁত কাস্ট সম্পন্ন হয়েছে, এটি কার্যকর হবে exec

i = (int) i + 1.5f
i = (int) 2.5f
i = 2

1

1 এবং 3 ইন্টিজার কনটেন্ট এবং তাই জাভা একটি পূর্ণসংখ্যা বিভাগ করে যার ফলাফল 0 হয় you আপনি যদি ডাবল কনস্ট্যান্ট লিখতে চান তবে আপনাকে লিখতে হবে 1.0এবং 3.0


1

সবচেয়ে সহজ সমাধানটি কেবল এটি করা

double g = ((double) 1 / 3);

এটি কী করে, যেহেতু আপনি ১.০ / ..০ প্রবেশ করেননি, তাই জাভা ধরে নিয়েছে যে এটি পূর্ণসংখ্যা বিভাগ, এবং এটি রূপান্তরকে সঙ্কুচিত করার অর্থ এমনকি এটি করবে since একে বলা হয় কাস্ট অপারেটর।


1

আমি এটা করেছি.

double g = 1.0/3.0;
System.out.printf("%gf", g);

ডাবল গণনা করার সময় .0 ব্যবহার করুন বা অন্যথায় জাভা ধরে নেবে আপনি পূর্ণসংখ্যার ব্যবহার করছেন। যদি কোনও গণনা কোনও পরিমাণে দ্বৈত মান ব্যবহার করে তবে আউটপুটটি দ্বিগুণ হবে। যদি সমস্তটি পূর্ণসংখ্যা হয় তবে আউটপুটটি একটি পূর্ণসংখ্যা হবে।


0

(১/৩) এর অর্থ পূর্ণসংখ্যা বিভাগ, কেন আপনি এই বিভাগ থেকে দশমিক মান পাবেন না ts এই সমস্যা সমাধানের জন্য ব্যবহার করুন:

public static void main(String[] args) {
        double g = 1.0 / 3;
        System.out.printf("%.2f", g);
    }

0
public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

যেহেতু 1 এবং 3 উভয়ই ফলাফলটি বৃত্তাকার নয় তবে এটি কেটে গেছে। সুতরাং আপনি ভগ্নাংশ উপেক্ষা এবং শুধুমাত্র পুরোপুরি গ্রহণ।

এটি এড়াতে আপনার 1 বা 3 সংখ্যার দশমিক ফর্ম হিসাবে 1.0 এবং / অথবা 3.0 হিসাবে অন্তত একটি থাকতে হবে।


0

এটি ব্যবহার করে দেখুন:

public static void main(String[] args) {
    double a = 1.0;
    double b = 3.0;
    double g = a / b;
    System.out.printf(""+ g);
}

দয়া করে কোড-কেবল উত্তরগুলি পোস্ট করবেন না, আপনার কোড কী করে এবং কীভাবে (এবং কেন) এটি সমস্যার সমাধান করে তার একটি ব্যাখ্যা অন্তর্ভুক্ত করুন। এটিও বিবেচনা করুন যে এটি একটি 8 বছরের পুরানো প্রশ্ন যা বিদ্যমান উত্তোলিত উত্তর রয়েছে এবং আপনার উত্তরটি বিদ্যমান উত্তরগুলির চেয়ে কোনও মান যুক্ত করে কিনা।
মার্ক রোটভিল

-1

"ডাবল জি = 1.0 / 3.0;" পরিবর্তে.


শুধু কৌতূহলী ... এই উত্তরটিতে কী ভুল? আমি যখন প্রথম সমস্যার মুখোমুখি হয়েছিলাম তখন আমি এই পদ্ধতির ব্যবহার করেছি। এই সমাধানটির সাথে কী ভুল রয়েছে তার একটি ব্যাখ্যা প্রশংসা হবে। আগাম ধন্যবাদ.
মিঃ পোর্ট সেন্ট জো

@ মিঃ পোর্টস্টজয়ে প্রশ্ন জিজ্ঞাসা করে এমন ব্যক্তিকে এটি কোনও বিবরণ দেয় না। শীর্ষ রেট দেওয়া উত্তরের দিকে তাকিয়ে আমরা দেখতে পাচ্ছি তারা কেন তা ঘটছে তা ব্যাখ্যা করেছে। উত্তরটি প্রযুক্তিগতভাবে সঠিক হতে পারে, তবে এটির উপযোগটি সীমিত হিসাবে দেখা যেতে পারে।
অ্যান্ড্রু টি ফিনেল

-1

অন্যান্য অনেকেই আসল বিষয়টি উল্লেখ করতে ব্যর্থ হয়েছেন:

শুধুমাত্র পূর্ণসংখ্যার উপর একটি ক্রিয়াকলাপ একটি পূর্ণসংখ্যার সাথে অপারেশনের ফলাফলকে কাস্ট করে।

এর অগত্যা অর্থ হ'ল ভাসমান পয়েন্টের ফলাফলগুলি, এটি একটি পূর্ণসংখ্যা হিসাবে প্রদর্শিত হতে পারে, কেটে নেওয়া হবে (দশমিক অংশটি ছাড়িয়ে যাবে)।

আপনি জিজ্ঞাসা করছেন কাস্টিং (টাইপকাস্টিং / টাইপ রূপান্তর) কী?

এটি ভাষা বাস্তবায়নের ক্ষেত্রে পরিবর্তিত হয়, তবে উইকিপিডিয়ায় মোটামুটি ব্যাপক দৃষ্টিভঙ্গি রয়েছে এবং এটি জবরদস্তি সম্পর্কেও কথা বলে , যা আপনার প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে তথ্যগুলির একটি মূল অংশ।

http://en.wikipedia.org/wiki/Type_conversion


এই উত্তর ত্রুটিযুক্ত। 1/2লক্ষ্যের ভাষা (জাভা) নয়, কোনও পূর্ণ সংখ্যার মতো ডেভিয়েশনটিতে জড়িত কোনও প্রকারের কাস্টিং বা প্রকার রূপান্তর নেই । আপনি কেবল একটি পূর্ণসংখ্যা বিভাগকে অনুরোধ করেন, যার ফলস্বরূপ পূর্ণসংখ্যার ফলাফল হবে। প্রকার কাস্টিং শুধুমাত্র থেকে আপ-রূপান্তর কারণ intএকটি থেকে doubleনিয়োগ হয়েছিল।
YoYo

@ YYYo আপনি কি বলছেন 0.5 একটি পূর্ণসংখ্যা? আমি তাই মনে করি না, homie।
সোভা

1
এই homie সম্পর্কে কিছুই বলেনি 0.5। সহজভাবে, জাভাতে, 1/2একটি পূর্ণসংখ্যা বিভাগ, যার ফলাফল শূন্য পূর্ণসংখ্যার হয়। আপনি একটি ডাবলকে একটি শূন্য নির্ধারণ করতে পারেন, এটি এখনও একটি শূন্য, 0.0দ্বিগুণ হলেও ।
YoYo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.