ম্যাথ.সিল ব্যবহার করে জাভা গোল করা int


103
int total = (int) Math.ceil(157/32);

কেন এটি এখনও 4 ফেরায়? 157/32 = 4.90625, আমাকে চারপাশে দাঁড় করাতে হবে, আমি চারপাশে দেখেছি এবং এটি সঠিক পদ্ধতি বলে মনে হচ্ছে।

আমি টাইপ totalহিসাবে চেষ্টা করেছি double, তবে 4.0 পেয়েছি ।

আমি কি ভুল করছি?

উত্তর:


192

আপনি করছেন 157/32যা একে অপরের সাথে দুটি পূর্ণসংখ্যা ভাগ করে দিচ্ছে , যার ফলস্বরূপ সর্বদা একটি বৃত্তাকার ডাউন পূর্ণসংখ্যা হয়। সুতরাং (int) Math.ceil(...)কিছুই করছে না। আপনি যা চান তা অর্জনের জন্য তিনটি সম্ভাব্য সমাধান রয়েছে। আমি বিকল্প 1 বা বিকল্প 2 ব্যবহার করার পরামর্শ দিই । বিকল্প 0 ব্যবহার করবেন না দয়া করে ।

## বিকল্প 0

রূপান্তর করুন aএবং bদ্বিগুণ করুন এবং আপনি বিভাগটি এবং এটি Math.ceilযেমন কাজ করতে চেয়েছিলেন তেমন ব্যবহার করতে পারেন । তবে আমি দৃ approach়ভাবে এই পদ্ধতির ব্যবহারকে নিরুৎসাহিত করি, কারণ দ্বিগুণ বিভাজন অপ্রচলিত হতে পারে। দ্বৈতদের অসম্পূর্ণতা সম্পর্কে আরও পড়ার জন্য এই প্রশ্নটি দেখুন

int n = (int) Math.ceil((double) a / b));

##বিকল্প 1

int n = a / b + ((a % b == 0) ? 0 : 1); 

তুমি a / bসবসময় যদি মেঝে সঙ্গে aএবং bউভয় পূর্ণসংখ্যা। তারপরে আপনার একটি ইনলাইন রয়েছে যদি বিবৃতি জাদুকরী মেঝে পরিবর্তে সিলিং করা উচিত কিনা তা পরীক্ষা করে। সুতরাং +1 বা +0, বিভাগের সাথে যদি আপনার অবশিষ্ট +1 প্রয়োজন হয় + a % b == 0বাকি জন্য চেক।

## বিকল্প 2

এই বিকল্পটি খুব সংক্ষিপ্ত, তবে সম্ভবত কিছু কম স্বজ্ঞাত জন্য। আমি মনে করি এই দ্বিগুণ বিভাগ এবং তুলনা পদ্ধতির তুলনায় এই স্বল্প স্বজ্ঞাত পদ্ধতিটি দ্রুত হবে:
দয়া করে নোট করুন যে এটি কার্যকর হয় না b < 0

int n = (a + b - 1) / b;

অতিরিক্ত প্রবাহের সম্ভাবনা হ্রাস করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন। তবে দয়া করে নোট করুন যে এটি a = 0এবং এর জন্য কাজ করে না b < 1

int n = (a - 1) / b + 1;

## "কম স্বজ্ঞাত পদ্ধতির" পিছনে ব্যাখ্যা

যেহেতু জাভাতে দুটি পূর্ণসংখ্যা ভাগ করা (এবং বেশিরভাগ অন্যান্য প্রোগ্রামিং ভাষাগুলি) সর্বদা ফলাফলের দিকে তাকাবে। সুতরাং:

int a, b;
int result = a/b (is the same as floor(a/b) )

তবে আমরা চাই না floor(a/b), তবে ceil(a/b), এবং উইকিপিডিয়া থেকে সংজ্ঞা এবং প্লট ব্যবহার করছি :এখানে চিত্র বর্ণনা লিখুন

ফ্লোর এবং সিল ফাংশনের এই প্লটগুলির সাথে আপনি সম্পর্কটি দেখতে পাবেন।

মেঝে ফাংশন সিল ফাংশন

আপনি এটি দেখতে পারেন floor(x) <= ceil(x)। আমরা প্রয়োজন floor(x + s) = ceil(x)। সুতরাং আমাদের সন্ধান করা দরকার s। যদি আমরা 1/2 <= s < 1এটি গ্রহণ করি তবে এটি সঠিক হবে (কিছু সংখ্যক চেষ্টা করুন এবং আপনি এটি দেখতে পাবেন) এটি প্রমাণ করা আমার পক্ষে কঠিন find এবং 1/2 <= (b-1) / b < 1, তাই

ceil(a/b) = floor(a/b + s)
          = floor(a/b + (b-1)/b)
          = floor( (a+b-1)/b) )

এটি আসল প্রমাণ নয়, তবে আমি আশা করি আপনারা এতে সন্তুষ্ট। যদি কেউ এটিকে আরও ভালভাবে ব্যাখ্যা করতে পারে তবে আমি এটিরও প্রশংসা করব। এটি ম্যাথওভারফ্লোতে জিজ্ঞাসা করুন ।


4
আপনি যদি স্বল্পতর স্বজ্ঞাত পদ্ধতির পিছনে অন্তর্দৃষ্টি ব্যাখ্যা করতে পারেন তবে এটি একটি বিশাল পক্ষপাতী হবে? আমি জানি এটি সঠিক, আমি কীভাবে এটি পেয়েছি এবং আমি কীভাবে গাণিতিকভাবে এটি সঠিক তা প্রদর্শন করতে পারি know আমি গাণিতিকভাবে এটি সমাধান করার চেষ্টা করেছি, বিশ্বাসী ছিল না।
সাদ রেহমান শাহ

আমি আশা করি আপনি আমার সম্পাদনায় সন্তুষ্ট, আমি ভাবার চেয়ে ভাল আর করতে পারি না :(
martijnn2008

আমি ধরে নিলাম ম্যাথ.ফ্লুর এবং সিল কেবলমাত্র পূর্ণসংখ্যা বিভাগের জন্য সঠিক যখন লম্বা বিভাগের জন্য নয় যখন মানগুলি দ্বিগুণ হয়। কাউন্টার উদাহরণগুলি 4611686018427386880/4611686018427387137 মেঝেতে ব্যর্থ হয় এবং 4611686018427386881/4611686018427386880 ছাদে ব্যর্থ হয়
ওয়াটার

4
স্পষ্টকরণের একটি বিষয়: বিকল্প 2 এর দুটি উপ-বিকল্পের ফলাফল সব ক্ষেত্রে অভিন্ন নয়। উইলের জন্য শূন্যের মান প্রথমটিতে 0 এবং দ্বিতীয়টিতে 1 প্রদান করে (যা বেশিরভাগ অ্যাপ্লিকেশনের জন্য সঠিক উত্তর নয়)।
সুশিসোর্স

4
আপনি কি নিশ্চিতরূপে এই
কথাটি

61

157/32 হয় int/int, যার ফলাফল একটি int

- ডবল আক্ষরিক ব্যবহার করার চেষ্টা করুন 157/32d, যা int/double, একটি যা ফলাফল double


আপনি কি নিশ্চিত যে ইন / ইন্টের ফলে সর্বদা কোনও ইনট ফলাফল হবে ?! আপনি কি উত্স দিতে পারেন দয়া করে ?!


35

157/32একটি পূর্ণসংখ্যা বিভাগ কারণ সমস্ত সংখ্যাসূচক dঅক্ষর পূর্ণসংখ্যা হয় অন্যথায় প্রত্যয় দ্বারা নির্দিষ্ট না করা হলে ( lদীর্ঘকাল ডাবল জন্য)

বিভাগটি দ্বিগুণ (৪.০) রূপান্তরিত হওয়ার আগে গোল করে নিচে পরিণত করা হয় যা পরে গোল করা হয় (৪.০)

যদি আপনি কোনও ভেরিয়েবল ব্যবহার করেন তবে আপনি এড়াতে পারবেন

double a1=157;
double a2=32;
int total = (int) Math.ceil(a1/a2);


7

সর্বাধিক স্বজ্ঞাত হিসাবে কেউ উল্লেখ করেনি:

int x = (int) Math.round(Math.ceil((double) 157 / 32));

এই সমাধানটি দ্বিগুণ বিভাগের অসম্পূর্ণতা স্থির করে।


4
ম্যাথ.গ্রাউন্ডটি দীর্ঘ প্রত্যাবর্তন করেছে
জুলকুরনাইন জুট

ধন্যবাদ @ জুলকুরাইন জট, একটি কাস্ট যোগ করেছেন
আইজি


3

দুটি পূর্ণসংখ্যা ভাগ করার সময়, যেমন,

int c = (int) a / (int) b;

ফলাফলটি একটি int, যার মানটি aভাগ করে bশূন্যের দিকে বৃত্তাকার হয়। কারণ ফলাফল ইতিমধ্যে গোল হয়ে গেছে, ceil()কিছু করবেন না। মনে রাখবেন যে এই বৃত্তাকারটি floor()নেতিবাচক অসীমের দিকে গোলাকার হিসাবে একই নয় । সুতরাং, 3/2সমান 1(এবং floor(1.5)সমান 1.0, তবে (-3)/2সমান -1(তবে floor(-1.5)সমান -2.0)।

এটি তাৎপর্যপূর্ণ কারণ কারণ যদি a/bসর্বদা একই হয় floor(a / (double) b)তবে আপনি কেবল ceil()এর a/bহিসাবে বাস্তবায়ন করতে পারেন -( (-a) / b)

ceil(a/b)থেকে পেতে পরামর্শ

int n = (a + b - 1) / b;, যা সমান a / b + (b - 1) / b, বা(a - 1) / b + 1

যখন পুরো সংখ্যাটি বাদে ceil(a/b)সর্বদা একের চেয়ে বড় হয় কারণ কাজ করে । সুতরাং, আপনি যদি পুরো সংখ্যাটি না করেন তবে পরবর্তী পুরো সংখ্যায় (বা অতীত) এটিকে টানতে চান । যুক্ত করা এটি করবে do পুরো সংখ্যার জন্য, এটি পুরোপুরি পুরো সংখ্যা পর্যন্ত তাদের ধাক্কা দেয় না। অন্য কিছুর জন্য, এটি হবে।floor(a/b)a/ba/b1 - 1 / b

হ্যাঁ আশা করি তা বোধগম্য হয়। আমি নিশ্চিত এটি ব্যাখ্যা করার জন্য আরও একটি গাণিতিক মার্জিত উপায় আছে।


2

কোনও সংখ্যাকে পূর্ণসংখ্যার থেকে আসল সংখ্যায় রূপান্তর করতে আপনি একটি বিন্দু যুক্ত করতে পারেন:

int total = (int) Math.ceil(157/32.);

এবং (157/32।) এর ফলাফলও আসল হবে। ;)



1

আপনার প্রশ্নের জন্য নীচের সমাধানটি পরীক্ষা করুন:

int total = (int) Math.ceil(157/32);

এখানে আপনার সংখ্যাটি ১.০ দিয়ে গুণ করা উচিত, তবে এটি আপনার উত্তর দেবে।

int total = (int) Math.ceil(157*1.0/32);

0

পছন্দ করার জন্য ডাবল ব্যবহার করুন

Math.ceil((double)value) বা পছন্দ

Math.ceil((double)value1/(double)value2);

0

জাভা /ডিফল্টরূপে কেবল তল বিভাগ সরবরাহ করে। তবে আমরা মেঝেতে সিলিং লিখতে পারি । দেখা যাক:

যে কোনও পূর্ণসংখ্যা yফর্মের সাথে লেখা যেতে পারে y == q*k+r। মেঝে বিভাগের সংজ্ঞা অনুসারে (এখানে floor) যা ঘুরছে r,

floor(q*k+r, k) == q  , where 0 ≤ r ≤ k-1

এবং সিলিং বিভাগের (এখানে ceil) যা বৃত্তাকার r₁,

ceil(q*k+r₁, k) == q+1  , where 1 ≤ r₁ ≤ k

যেখানে আমরা প্রতিস্থাপন করতে পারেন r+1জন্য r₁:

ceil(q*k+r+1, k) == q+1  , where 0 ≤ r ≤ k-1


তারপরে আমরা qপাওয়ার জন্য প্রথম সমীকরণটি তৃতীয়টির পরিবর্তিত করি

ceil(q*k+r+1, k) == floor(q*k+r, k) + 1  , where 0 ≤ r ≤ k-1

অবশেষে, কোন পূর্ণসংখ্যা দেওয়া yযেখানে y = q*k+r+1কিছু জন্য q, k, r, আমরা

ceil(y, k) == floor(y-1, k) + 1

এবং আমরা সম্পন্ন। আশাকরি এটা সাহায্য করবে.


আমি নিশ্চিত যে এটি সঠিক, তবে যেহেতু এর বিন্দুটি স্পষ্ট করা, তা কেন আমার কাছে স্পষ্ট নয় যে কেন ceilঅন্তর্নিহিত সংজ্ঞা থেকে এইরকম সংজ্ঞা দেওয়া হয়েছে, বিশেষত যেখানে আমরা একটি পূর্ণসংখ্যার সিলটি নিচ্ছি, অর্থাৎ আর 1 = কে। যেহেতু প্রান্তের কেসগুলি এটি সম্পর্কে জটিল, তাই আমি মনে করি এটি আরও কিছুটা বানান করা দরকার।
লুইজি প্লিঞ্জ

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

0

দুটি পদ্ধতি রয়েছে যার মাধ্যমে আপনি আপনার দ্বিগুণ মূল্যকে সংযুক্ত করতে পারেন।

  1. ম্যাথ.সিল
  2. ম্যাথ.ফ্লুর

যদি আপনি আপনার উত্তর 4.90625 4 হিসাবে চান তবে আপনার ম্যাথ.ফ্লুরটি ব্যবহার করা উচিত এবং আপনি যদি নিজের উত্তর 4.90625 5 হিসাবে চান তবে আপনি ম্যাথ.সিল ব্যবহার করতে পারেন

আপনি তার জন্য নিম্নলিখিত কোড উল্লেখ করতে পারেন।

public class TestClass {

    public static void main(String[] args) {
        int floorValue = (int) Math.floor((double)157 / 32);
        int ceilValue = (int) Math.ceil((double)157 / 32);
        System.out.println("Floor: "+floorValue);
        System.out.println("Ceil: "+ceilValue);

    }

}

0

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

final var dividend = BigDecimal.valueOf(157);
final var divisor = BigDecimal.valueOf(32);
final var result = dividend.divide(divisor, RoundingMode.CEILING).intValue();

-3
int total = (157-1)/32 + 1

বা আরও সাধারণ

(a-1)/b +1 

আমি মনে করি এটি কাজ করে, তবে আসল সংস্করণটি কেন কাজ করে না তা আপনি সত্যই ব্যাখ্যা করেননি।
টিপিওম

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