int total = (int) Math.ceil(157/32);
কেন এটি এখনও 4 ফেরায়? 157/32 = 4.90625
, আমাকে চারপাশে দাঁড় করাতে হবে, আমি চারপাশে দেখেছি এবং এটি সঠিক পদ্ধতি বলে মনে হচ্ছে।
আমি টাইপ total
হিসাবে চেষ্টা করেছি double
, তবে 4.0 পেয়েছি ।
আমি কি ভুল করছি?
উত্তর:
আপনি করছেন 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) )
এটি আসল প্রমাণ নয়, তবে আমি আশা করি আপনারা এতে সন্তুষ্ট। যদি কেউ এটিকে আরও ভালভাবে ব্যাখ্যা করতে পারে তবে আমি এটিরও প্রশংসা করব। এটি ম্যাথওভারফ্লোতে জিজ্ঞাসা করুন ।
157/32 হয় int/int
, যার ফলাফল একটি int
।
- ডবল আক্ষরিক ব্যবহার করার চেষ্টা করুন 157/32d
, যা int/double
, একটি যা ফলাফল double
।
157/32
একটি পূর্ণসংখ্যা বিভাগ কারণ সমস্ত সংখ্যাসূচক d
অক্ষর পূর্ণসংখ্যা হয় অন্যথায় প্রত্যয় দ্বারা নির্দিষ্ট না করা হলে ( l
দীর্ঘকাল ডাবল জন্য)
বিভাগটি দ্বিগুণ (৪.০) রূপান্তরিত হওয়ার আগে গোল করে নিচে পরিণত করা হয় যা পরে গোল করা হয় (৪.০)
যদি আপনি কোনও ভেরিয়েবল ব্যবহার করেন তবে আপনি এড়াতে পারবেন
double a1=157;
double a2=32;
int total = (int) Math.ceil(a1/a2);
সর্বাধিক স্বজ্ঞাত হিসাবে কেউ উল্লেখ করেনি:
int x = (int) Math.round(Math.ceil((double) 157 / 32));
এই সমাধানটি দ্বিগুণ বিভাগের অসম্পূর্ণতা স্থির করে।
জাভাতে .0 যোগ করা এটি একটি দ্বিগুণ করে দেবে ...
int total = (int) Math.ceil(157.0 / 32.0);
দুটি পূর্ণসংখ্যা ভাগ করার সময়, যেমন,
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/b
a/b
1 - 1 / b
হ্যাঁ আশা করি তা বোধগম্য হয়। আমি নিশ্চিত এটি ব্যাখ্যা করার জন্য আরও একটি গাণিতিক মার্জিত উপায় আছে।
কোনও সংখ্যাকে পূর্ণসংখ্যার থেকে আসল সংখ্যায় রূপান্তর করতে আপনি একটি বিন্দু যুক্ত করতে পারেন:
int total = (int) Math.ceil(157/32.);
এবং (157/32।) এর ফলাফলও আসল হবে। ;)
জাভা /
ডিফল্টরূপে কেবল তল বিভাগ সরবরাহ করে। তবে আমরা মেঝেতে সিলিং লিখতে পারি । দেখা যাক:
যে কোনও পূর্ণসংখ্যা 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 = কে। যেহেতু প্রান্তের কেসগুলি এটি সম্পর্কে জটিল, তাই আমি মনে করি এটি আরও কিছুটা বানান করা দরকার।
দুটি পদ্ধতি রয়েছে যার মাধ্যমে আপনি আপনার দ্বিগুণ মূল্যকে সংযুক্ত করতে পারেন।
যদি আপনি আপনার উত্তর 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);
}
}
আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমার মতে, আমাদের আরও ভাল পদ্ধতি রয়েছে যা নির্ভুল ক্ষতি এড়াতে বিগডিসিমাল ব্যবহার করছে । যাইহোক, এই সমাধানটি ব্যবহার করে আমাদের বেশ কয়েকটি রাউন্ডিং এবং স্কেল কৌশলগুলি ব্যবহার করার সম্ভাবনা রয়েছে।
final var dividend = BigDecimal.valueOf(157);
final var divisor = BigDecimal.valueOf(32);
final var result = dividend.divide(divisor, RoundingMode.CEILING).intValue();