रूबी में विभाजन दशमलव मान के बजाय पूर्णांक क्यों लौटा रहा है?


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 उत्तर अधिक उपयोगी लगता है। क्या रूबी में 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
यह मेरे द्वारा परीक्षण किया गया सबसे तेज़ तरीका है, अधिक प्रदर्शन प्राप्त करने का एकमात्र तरीका ऑपरेंड को विभाजित करना है जो कि शुरू करने के लिए तैरता है। मैंने सिंटैक्स सीखने के लिए रूबी में एक प्रमुख संख्या जनरेटर का निर्माण किया है, अब मैं इसे सीखने के लिए अनुकूलन कर रहा हूं जो सबसे अच्छा काम करता है। यहाँ बेंचमार्क मैं एक साथ रखा गया है: 'बेस 64' की आवश्यकता होती है; आवश्यकता 'zlib'; पुट Zlib.inflate (Base64.decode64 ( "eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi / घ / kQ71QBOtAVFLEDly05 + UYQ2H + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + XuOJ2XdO60dKsjC7aBtyTL5O5hLk ="))
Chinoto Vokro

एक प्रश्न, क्या यह उस सटीकता को संरक्षित करेगा जैसे हम 'दशमलव' का उपयोग कर रहे हैं?
एडम ऐकेन

39

आप इसे irb से देख सकते हैं:

$ 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
Mathn मॉड्यूल रूबी 2.2 के बाद से हटा दिया गया है
मायर


6

यहां फिक्सनम # to_r का उल्लेख नहीं किया गया है, यह रूबी 1.9 के बाद से पेश किया गया था। यह Fixnum को तर्कसंगत रूप में परिवर्तित करता है। नीचे इसके उपयोग के उदाहरण दिए गए हैं। यह तब तक सटीक विभाजन भी दे सकता है जब तक कि उपयोग किए गए सभी नंबर फिक्सनम हैं।

 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 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.