2012-06-25 10 views
5

मैं वर्तमान में counts["email"] को एक हैश को विभाजित करने की कोशिश कर रहा हूं जिसमें एक चरद्वारा 82,000 है जिसमें मूल्य 1.3 मिलियन है।मैं फ़िक्सनम को किसी अन्य फ़िक्सम से विभाजित क्यों नहीं कर सकता?

जब मैं puts counts["email"]/total चलाने मैं 0.

क्यों मैं इन पर विभाजन प्रदर्शन नहीं कर सकते?

+1

यदि दोनों ऑपरेटरों पूर्णांक हैं, रूबी पूर्णांक विभाजन करता है: http://mathworld.wolfram.com/IntegerDivision.html –

उत्तर

7

क्योंकि रूबी कैसे काम करता है: जब आप पूर्णांक को पूर्णांक विभाजित करते हैं, तो आपको एक पूर्णांक मिलता है। इस मामले में यह 0 होगा, क्योंकि यह परिणाम का पूर्णांक हिस्सा है।

फ्लोट परिणाम प्राप्त करने के लिए, बस रूबी को बताएं कि आपको वास्तव में एक फ्लोट की आवश्यकता है! वहाँ यह करने के लिए कई तरह से कर रहे हैं, मुझे लगता है कि सबसे सरल सिर्फ संकार्य फ्लोट करने के लिए परिवर्तित किया जाएगा ...

puts counts["email"]/total.to_f 
+3

केवल रूबी नहीं, यह प्रोग्रामिंग भाषाओं की बहुमत का व्यवहार है! Denominator को एक फ्लोट में परिवर्तित करना या तो इसे हल करने का एकमात्र तरीका नहीं है। यदि गणितीय सटीकता वांछित है, 'तर्कसंगत (गणना ["ईमेल"], कुल) 'बेहतर होगा। ध्यान दें कि 'तर्कसंगत' मानक पुस्तकालय में 1.9 से पहले संस्करणों में है। – Max

+0

मुझे लगता है कि मूल बिंदु यह है कि क्या भाषा गतिशील रूप से- या स्थैतिक रूप से टाइप की गई है। पर्ल, जावास्क्रिप्ट और PHP (जिन भाषाओं में मैंने सबसे अधिक काम किया है) यहां फ्लोट वैल्यू प्रिंट करेंगे - भले ही उत्तरार्द्ध में 'फ़्लोट' प्रकार हो। – raina77ow

+1

रूबी और पायथन 2.7 (पायथन 3 नहीं) गतिशील रूप से टाइप की गई भाषाएं हैं जहां पूर्णांक विभाजन एक फ्लोट के बजाय पूर्णांक मात्रा में परिणाम देता है। – Max

0

आपको "पूर्ण" परिणाम प्राप्त करने के लिए फ़्लोट का उपयोग करने की आवश्यकता है।

counts["email"]/total.to_f 
9

आप विभाजन प्रदर्शन कर रहे हैं, हालांकि वह नहीं जिसका आप की उम्मीद है।

# Integer division: 
5/4  # => 1 

# Floating point division: 
5.fdiv(4) # => 1.25 

# Rational division: 
5.quo(4) # => Rational(5, 4) 

तुम भी करने के लिए एक Float या एक Rational अपने पूर्णांक में से एक में बदल सकते हैं:

5.to_f/4 # => 1.25 
5.to_r/4 # => Rational(5, 4) 

ध्यान दें कि पहले बुला fdiv सीधे faster है बुला से वहाँ रूबी में पूर्णांक विभाजित करने के लिए विभिन्न तरीके हैं to_f और फिर / ऑपरेटर का उपयोग कर। यह यह भी स्पष्ट करता है कि आप फ़्लोटिंग पॉइंट डिवीजन का उपयोग कर रहे हैं।

+0

-1 के लिए एक टिप्पणी की सराहना की जाएगी। –