রুবিতে বিভাগ কেন দশমিক মানের পরিবর্তে পূর্ণসংখ্যা ফেরত দেয়?


256

উদাহরণ স্বরূপ:

9 / 5  #=> 1

কিন্তু আমি আশা 1.8। আমি কীভাবে দশমিক (অ-পূর্ণসংখ্যার) ফলাফল পেতে পারি? কেন একেবারেই ফিরছে 1?


4
মনে রাখবেন যে আপনি যদি এই মানটি ফিরিয়ে দেওয়ার জন্য কোনও পদ্ধতি ব্যবহার করেন তবে আপনাকে এটিকে কোনও ভেরিয়েবলের জন্য বরাদ্দ দেওয়ার প্রয়োজন হবে না; কেবল def method; a - b/8; endপদ্ধতি থেকে গণনার ফলাফলটি ফিরিয়ে আনবে, কারণ কোনও পদ্ধতি কলের সর্বশেষ প্রকাশটি হ'ল প্রত্যাবর্তন মান।
ফ্রোগজ

উত্তর:


268

এটি পূর্ণসংখ্যা বিভাগ করছে। আপনি Floatযোগ করে একটি সংখ্যা তৈরি করতে পারেন .0:

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8

10
এটি কাজ করে তবে নীচে to_f উত্তরটি আরও দরকারী বলে মনে হচ্ছে। টু_ফুটি কি রুবিতে আরও বুদ্ধিমান?
নোটপ্যাচ

9
.to_fযদি আপনি দুটি ভেরিয়েবল যে পূর্ণসংখ্যার থাকে, যেমন বিভাজক করছি উত্তর উত্তম a.to_f / b। আপনি যদি আক্ষরিক অর্থে দুটি হার্ড-কোডেড পূর্ণসংখ্যা ভাগ (যা সম্ভবত অদ্ভুত), তবে ব্যবহার 9.0 / 5করা ভাল।
jefflunt

350

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

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8

আপনার মানগুলি আক্ষরিক পরিবর্তে পরিবর্তনশীল হলে এটিও কাজ করে। একটি মানকে একটি ফ্লোটে রূপান্তর করা পুরো অভিব্যক্তিটিকে ভাসমান বিন্দুতে জোর করতে যথেষ্ট।


1
এটি গৃহীত উত্তরের চেয়ে আরও বেশি "রেল" উত্তর।
শান রায়ান

@ মিস্টুশোর্ট: আমি এর প্রতিলিপি করতে পারছি না, দুঃখিত। আমি সম্ভবত কিছু ভুল করছিলাম।
জোওও কস্তা

4
@ সিয়ানআরয়ান কেন সাধারণভাবে রুবির চেয়ে বিশেষত রেলস? আমি দেখতে পাচ্ছি না কেন কোনও (রুবি অন) রেল বিকাশকারী এই নির্দিষ্ট কাজটি সাধারণ রুবি বিকাশকারীদের চেয়ে আলাদাভাবে করবে। সম্ভবত আমি শব্দার্থবিজ্ঞানকে কেবল নিটপিকিং করছি এবং বেশিরভাগ মানুষ কেবল (রুবি অন) রেলস এবং রুবিকে এই জাতীয় ক্ষেত্রে সমার্থক হিসাবে দেখছেন।
চিনোটো ভোকরো

169

এর Numeric#fdivপরিবর্তে আপনি ব্যবহার করতে পারেন এমন পদ্ধতিও রয়েছে:

9.fdiv(5)  #=> 1.8

1
এটি আমি পরীক্ষিত দ্রুততম পদ্ধতি, আরও বেশি পারফরম্যান্স পাওয়ার একমাত্র উপায় হল অপারেশনগুলি ভাগ করা যা শুরু করা যায়। সিনট্যাক্স শিখতে আমি রুবিতে একটি প্রাইম নম্বর জেনারেটর তৈরি করেছি, এখন আমি কী সেরা কাজ করে তা শিখতে এটির অনুকূলতা তৈরি করেছি। এখানে বেঞ্চমার্ক আমি একত্র করা হল: 'করুন Base64-' প্রয়োজন; প্রয়োজন 'zlib'; রাখে Zlib.inflate (Base64.decode64 ( "eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + + rPgSdiCOi / ডি / kQ71QBOtAVFLEDly05 + + UYQ2H + + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + + XuOJ2XdO60dKsjC7aBtyTL5O5hLk ="))
Chinoto Vokro

একটি প্রশ্ন, আমরা 'দশমিক' ব্যবহার করছি এর মতো নির্ভুলতা সংরক্ষণ করবে?
অ্যাডাম একেন

39

আপনি এটি আইআরবি দিয়ে পরীক্ষা করতে পারেন:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667

26

আপনি রুবি mathnমডিউলটি অন্তর্ভুক্ত করতে পারেন ।

require 'mathn'

এইভাবে, আপনি বিভাগটি স্বাভাবিকভাবে তৈরি করতে সক্ষম হতে চলেছেন।

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203

এইভাবে, আপনি সঠিক বিভাগ (ক্লাস রেশনাল) পাবেন যতক্ষণ না আপনি এমন কোনও অপারেশন প্রয়োগ করার সিদ্ধান্ত নেন যা উদাহরণস্বরূপ যুক্তিযুক্ত হিসাবে প্রকাশ করা যায় না Math.sin


1
ম্যাথন মডিউলটি রুবি ২.২
মেয়ের


6

ফিক্সনাম # টু_আর এখানে উল্লেখ করা হয়নি, এটি রুবি ১.৯ থেকে প্রবর্তিত হয়েছিল। এটি ফিকনামকে যৌক্তিক আকারে রূপান্তর করে। নীচে এর ব্যবহারের উদাহরণ দেওয়া আছে। যতক্ষণ না ব্যবহৃত সমস্ত সংখ্যা ফিক্সনাম হয় ততক্ষণ এটি নির্ভুল বিভাগ দিতে পারে।

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0

উদাহরণস্বরূপ যেখানে যুক্তিযুক্ত সংখ্যায় চালিত একটি ভাসা ফলাফল প্রবাহিত করতে ভাসতে পারে।

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.