रूबी में गोलाई तैर रही है


150

मुझे चक्कर लगाने में समस्या हो रही है। मेरे पास एक फ्लोट है, जिसे मैं एक दशमलव के सौवें भाग में गोल करना चाहता हूं। हालांकि, मैं केवल वही उपयोग कर सकता हूं .roundजो मूल रूप से इसे एक इंट में बदल देता है, जिसका अर्थ 2.34.round # => 2. है कि कुछ करने के लिए एक सरल प्रभाव तरीका है2.3465 # => 2.35

जवाबों:


181

प्रदर्शित करते समय, आप उपयोग कर सकते हैं (उदाहरण के लिए)

>> '%.2f' % 2.3465
=> "2.35"

यदि आप इसे राउंड स्टोर करना चाहते हैं, तो आप उपयोग कर सकते हैं

>> (2.3465*100).round / 100.0
=> 2.35

2
धन्यवाद। मुझे महसूस नहीं हुआ कि स्प्रिंटफ मेरे लिए गोलाई का ध्यान रखेगा। sprintf '%.2f', 2.3465भी काम करता है।
नूह सूसमान

66
value.round (2) इस समाधान से बेहतर है
किट हो

12
ध्यान रखें कि 2.3000.round(2) => 2.3और sprintf '%.2f', 2.300 => 2.30। मेरी राय में यह राउंड () में एक दोष है, या इसमें अनुगामी शून्य को संरक्षित करने का विकल्प होना चाहिए।
१al

14
@Excalibur 2.3000.round(2)एक संख्या है, न कि एक स्ट्रिंग। कोई तरीका नहीं है कि संख्या 2.3से अलग है 2.30, इसलिए अनुगामी शून्य को संरक्षित करने का कोई विकल्प नहीं है। आप अपना स्वयं का वर्ग बना सकते हैं नंबर_with_significance लेकिन फिर हमारे पास पहले से ही तार हैं।
रूबी नुबी

6
ध्यान दें कि हालांकि यह दो दशमलव स्थानों के लिए काम करता है , फिर भी '%.3f' % 1.2345(3 दशमलव स्थानों, 2 नहीं) में एक दोष है !! उसी के लिए sprintfभी। खबरदार। वह => 1.234 नहीं लौटेगा => 1.235जैसा कि अधिकांश उम्मीद करेंगे (iow, 2 दशमलव के बाद, स्प्रिंटफ राउंड 5 नीचे और केवल 6 अप राउंड होगा)। यही कारण है कि किट हो की टिप्पणी के ऊपर 25+ अपवोट हैं। उपयोग करने के लिए सुरक्षित है, '%.3f' % 1.2345.round(3)इसलिए संख्या .roundपहले से ठीक से गोल है , फिर स्वरूपित (अनुगामी शून्य के साथ, यदि आवश्यक हो)।
likethesky

392

गोल करने के लिए दशमलव स्थानों की संख्या वाले राउंड को तर्क पास करें

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347

8
यह गुणा, गोलाई और विभाजन से अधिक समझदार प्रतीत होगा। +1
मार्क एंगलिंग

3
हम्म यह विधि रूबी 1.8.7 में नहीं लगती है। शायद 1.9 में?
ब्रायन आर्मस्ट्रांग

2
@Brian। यह निश्चित रूप से 1.9 में है और रेल में भी है (इस सवाल के साथ टैग किया गया था)
स्टीव वीट

3
रूबी 1.8.7 के राउंड मेथड में यह क्षमता नहीं है, दशमलव स्थान गोलाई पैरामीटर को जोड़ना 1.9 की क्षमता है
bobmagoo

1
ध्यान दें कि आपको इसके साथ शून्य नहीं मिलता है, इसलिए 1.1.round(2)=> 1.1नहीं1.10
NotAnAmbiTurner

9

आप इसे एक प्रीज़निंग के लिए राउंडिंग के लिए उपयोग कर सकते हैं।

//to_f is for float

salary= 2921.9121
puts salary.to_f.round(2) // to 2 decimal place                   

puts salary.to_f.round() // to 3 decimal place          

7

आप फ्लोट क्लास में एक विधि जोड़ सकते हैं, मैंने इसे स्टैकओवरफ्लो से सीखा है:

class Float
    def precision(p)
        # Make sure the precision level is actually an integer and > 0
        raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0
        # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0
        return self.round if p == 0
        # Standard case  
        return (self * 10**p).round.to_f / 10**p
    end
end

3

आप roundविधि के तर्क के रूप में 10, 100 और इतने पर निकटतम गुणनखंड के लिए एक नकारात्मक संख्या प्रदान कर सकते हैं ।

# Round to the nearest multiple of 10. 
12.3453.round(-1)       # Output: 10

# Round to the nearest multiple of 100. 
124.3453.round(-2)      # Output: 100



1

यदि आपको इसे प्रदर्शित करने की आवश्यकता है, तो मैं number_with_preaches सहायक का उपयोग करूंगा । यदि आपको इसकी आवश्यकता है तो मैं कहीं और उपयोग करूंगा, जैसा कि स्टीव वीट ने बताया है, roundविधि


1
ध्यान दें कि number_with_precisionरेल-केवल विधि है।
स्मार

0

रूबी 1.8.7 के लिए आप अपने कोड में निम्नलिखित जोड़ सकते हैं:

class Float
    alias oldround:round
    def round(precision = nil)
        if precision.nil?
            return self
        else
            return ((self * 10**precision).oldround.to_f) / (10**precision)
        end 
    end 
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.