রুবিতে গোলাকার ভাসা


150

আমার চারপাশে সমস্যা হচ্ছে। আমার একটি ভাসা রয়েছে, যা আমি দশমিক একশত ভাগ করতে চাই। যাইহোক, আমি কেবল .roundএটিই ব্যবহার করতে পারি যা মূলত এটি একটি অন্তর্বিজ্ঞানে রূপান্তরিত হয়, অর্থ এর 2.34.round # => 2. মতো কিছু করার কোনও সহজ প্রভাব উপায় way2.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। আমার মতে এটি গোল () এর একটি ত্রুটি, অথবা এটির পিছনের শূন্যগুলি সংরক্ষণের বিকল্প থাকা উচিত।
এক্সকালেবুর

14
@ এক্সকালিবুর 2.3000.round(2)একটি সংখ্যা, একটি স্ট্রিং নয়। সংখ্যাটি 2.3পৃথক হওয়ার 2.30কোনও উপায় নেই, সুতরাং চলমান শূন্যগুলি সংরক্ষণের বিকল্প থাকার কোনও উপায় নেই। আপনি আপনার নিজস্ব সংখ্যাগুলি_সংখ্যক_গুরুত্বপূর্ণ বর্গ তৈরি করতে পারেন তবে তারপরে আমাদের ইতিমধ্যে স্ট্রিং রয়েছে।
রুবি নবি

6
মনে রাখবেন যে এটি দুটি দশমিক জায়গার জন্য কাজ করে তবে একটি ত্রুটি রয়েছে '%.3f' % 1.2345(3 দশমিক স্থানে, 2 নয়) তবে !! sprintfপাশাপাশি একই । সতর্ক থাকুন। যে ফিরে আসবে => 1.234 না => 1.235 অধিকাংশ আশা (IOW, 2nd দশমিক,, sprintf চক্রের 5 পরে নিচে এবং শুধুমাত্র একটি 6 আপ চক্রের)। এই কারণেই উপরের কিট হো এর মন্তব্যে 25+ টি আপভোট রয়েছে। ব্যবহারে নিরাপদ, '%.3f' % 1.2345.round(3)সুতরাং সংখ্যাটি .roundপ্রথমে যথাযথভাবে বৃত্তাকার হয় , তারপরে ফর্ম্যাট করা হয় (প্রয়োজনে পিছনের জিরো সহ)।
likethesky

392

রাউন্ডে দশমিক জায়গাগুলির সংখ্যা সহ গোল করে একটি যুক্তি পাস করুন Pass

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

8
এটি গুণমান, বৃত্তাকার এবং বিভাজনের চেয়ে আরও বুদ্ধিমান মনে হবে। +1
এম্বলিং মার্ক করুন

3
হুম এই পদ্ধতিটি রুবি ১.৮..7 তে আছে বলে মনে হচ্ছে না। হতে পারে 1.9 সালে?
ব্রায়ান আর্মস্ট্রং

2
@Brian। এটি অবশ্যই ১.৯-এ রয়েছে এবং রেলের মধ্যেও রয়েছে (যা দিয়ে এই প্রশ্নটি ট্যাগ করা হয়েছিল)
স্টিভ ওয়েট

3
রুবি 1.8.7 এর রাউন্ড পদ্ধতিতে এই ক্ষমতা নেই, দশমিক স্থানের রাউন্ডিং পরামিতি যুক্ত করা একটি 1.9 ক্ষমতা
ববমাগু

1
নোট করুন যে আপনি এটি দিয়ে শূন্যগুলি অনুসরণ করবেন না, সুতরাং 1.1.round(2)=> 1.1নয়1.10
নোটএএনবিবিবার্নার

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

এছাড়াও round10, 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

আপনার যদি এটি প্রদর্শন করার দরকার হয় তবে আমি সংখ্যা_বিহীন_প্রেসিশন সহায়ক ব্যবহার করব । আপনার যদি অন্য কোথাও এটির প্রয়োজন হয় তবে আমি স্টিভ ওয়েটটি নির্দেশ করেছিলাম, roundপদ্ধতিটি


1
দ্রষ্টব্য যে number_with_precisionকেবলমাত্র রেলগুলিই।
স্মার

0

রুবি ১.৮. For এর জন্য আপনি নিম্নলিখিত কোডগুলিতে যুক্ত করতে পারেন:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.