পাইথনের রাউন্ড 5 (বা অন্যান্য সংখ্যা)


162

নীচের মত গোল করে যেতে পারে এমন কোনও অন্তর্নির্মিত কার্য রয়েছে?

10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20

উত্তর:


304

পাইথনে আমি কোনও স্ট্যান্ডার্ড ফাংশন জানি না, তবে এটি আমার পক্ষে কাজ করে:

পাইথন 2

def myround(x, base=5):
    return int(base * round(float(x)/base))

Python3

def myround(x, base=5):
    return base * round(x/base)

উপরের কাজগুলি কেন কাজ করে তা সহজেই দেখা যায়। আপনি নিশ্চিত করতে চান যে 5 দ্বারা বিভাজিত আপনার সংখ্যাটি একটি পূর্ণসংখ্যা, সঠিকভাবে বৃত্তাকার। সুতরাং, আমরা প্রথমে ঠিক এটিই করি ( round(float(x)/5)যেখানে floatকেবল পাইথন 2 তে প্রয়োজনীয়) এবং তারপরে আমরা 5 দ্বারা বিভক্ত হয়েছি, আমরা পাশাপাশি 5 দ্বারাও গুণ করি। চূড়ান্ত রূপান্তর intকারণ round()পাইথন 2 এ একটি ভাসমান-পয়েন্ট মান দেয়।

আমি base5 কে ডিফল্ট করে একটি প্যারামিটার দিয়ে ফাংশনটিকে আরও জেনেরিক করে তুলেছি।


3
যদি কেবল পূর্ণসংখ্যা এবং গোলাকার হয়ে থাকে তবে আপনি কেবল করতে পারেনx // base * base
Tjorriemorrie

7
এই আমাকে ভীতু হচ্ছে কিন্তু আমি ব্যবহার করতে পছন্দ floor()এবং ceil()তুলনায় ভোটদান বরং:base * floor(x/base)
user666412

1
@ ব্যবহারকারী 646464৪১২ math.floorএবং math.ceilকাস্টম বেসের সাথে ব্যবহারের অনুমতি দেবেন না, তাই পছন্দটি অপ্রাসঙ্গিক।
একিউম্যানাস

48

অ-পূর্ণসংখ্যার মানগুলিকে গোল করার জন্য যেমন 0.05:

def myround(x, prec=2, base=.05):
  return round(base * round(float(x)/base),prec)

প্যারামিটারের মানগুলি পরিবর্তন না করেই "গোল (" "থেকে" মাইগ্রাউন্ডে "" পরিবর্তন করার জন্য) আমার কোডটিতে সন্ধান এবং প্রতিস্থাপন করতে পারার পরে আমি এটি দরকারী পেয়েছি।


2
আপনি ব্যবহার করতে পারেন: def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec) যা নম্রি অ্যারে গ্রহণ করে।
সৌখিক

23

এটি কেবল স্কেলিংয়ের বিষয়

>>> a=[10,11,12,13,14,15,16,17,18,19,20]
>>> for b in a:
...     int(round(b/5.0)*5.0)
... 
10
10
10
15
15
15
15
15
20
20
20

14

'বিশ্রাম' অপসারণ কাজ করবে:

rounded = int(val) - int(val) % 5

মানটি যদি পূর্ণসংখ্যক হয় তবে:

rounded = val - val % 5

একটি ফাংশন হিসাবে:

def roundint(value, base=5):
    return int(value) - int(value) % int(base)

নিকটতম ভগ্নাংশের মানকে গোল করার জন্য আমি এই উত্তরটি পছন্দ করি। যেমন আমি যদি কেবল 0.25 এর ইনক্রিমেন্ট চাই want
জার্সি বিন 20


9

বৃত্তাকার (x [, n]): মানগুলি 10 বিয়োগফলের নিকটতম একাধিকের সাথে গোল হয়। সুতরাং এন যদি নেতিবাচক হয় ...

def round5(x):
    return int(round(x*2, -1)) / 2

যেহেতু 10 = 5 * 2, আপনি ভাসমান বিভাগ এবং 5.0 দিয়ে গুণনের পরিবর্তে পূর্ণসংখ্যা বিভাগ এবং 2 দিয়ে গুণ করতে পারেন। আপনি যদি কিছুটা স্থানান্তর পছন্দ না করেন তবে এটি যে খুব বেশি গুরুত্বপূর্ণ তা নয়

def round5(x):
    return int(round(x << 1, -1)) >> 1

1
আমাদের যে রাউন্ডটি দেখানোর জন্য +1 () উচ্চ মানের সহ 1.0 টির চেয়ে বহুগুণগুলিতে রাউন্ডিং পরিচালনা করতে পারে। (তবে নোট করুন যে, বিট-শিফটিং পদ্ধতির কাজটি ভাসমানদের সাথে কাজ করবে না, এটি বেশিরভাগ প্রোগ্রামারদের কাছে খুব কম পাঠযোগ্য তা উল্লেখ না করে))
পিটার হ্যানসেন

1
@ পিটার হানসেন +1 এর জন্য ধন্যবাদ। ফ্লোটের সাথে কাজ করতে বিট শিফটিংয়ের জন্য একটি ইনট (এক্স) থাকা দরকার। সর্বাধিক পঠনযোগ্য নয় এবং আমি নিজেই এটি ব্যবহার করব না বলে স্বীকার করেছেন তবে আমি এটির "বিশুদ্ধতা" পছন্দ করি যা কেবলমাত্র 2 বা 5 এর নয় 1 এর সাথে জড়িত।
pwdyson

6

দুঃখিত, আমি অলোক সিংহাইয়ের জবাব সম্পর্কে মন্তব্য করতে চেয়েছিলাম, তবে খ্যাতির অভাবের কারণে এটি আমাকে আসতে দেয় না = /

যাইহোক, আমরা আরও একটি ধাপ সাধারণ করতে পারি এবং যেতে পারি:

def myround(x, base=5):
    return base * round(float(x) / base)

এটি আমাদের পছন্দসই .25বা অন্য কোনও ভগ্নাংশের ভিত্তিতে অ-পূর্ণসংখ্যার ঘাঁটি ব্যবহার করতে দেয় ।


উত্তর হিসাবে মন্তব্য পোস্ট করে নতুন ব্যবহারকারীর নিষেধাজ্ঞাগুলি উপেক্ষা করার চেষ্টা করবেন না। বিধিনিষেধ একটি কারণ জন্য বিদ্যমানকেন এবং কীভাবে কিছু উত্তর মুছে ফেলা হয় তার
বিদায় স্ট্যাক এক্সচেঞ্জ

4

বিভাজনের সংস্করণ :-)

def divround(value, step, barrage):
    result, rest = divmod(value, step)
    return result*step if rest < barrage else (result+1)*step

সুতরাং এই ক্ষেত্রে আপনি বিভক্ত ব্যবহার (মান, 5, 3)? বা হতে পারে বিভক্ত (মান, 5, 2.5)?
pwdyson

বিভক্ত (মান, 5, 3), ঠিক
খ্রিস্টান হাউসনেচেট

4

ব্যবহার করুন:

>>> def round_to_nearest(n, m):
        r = n % m
        return n + m - r if r + r >= m else n - r

এটি গুন ব্যবহার করে না এবং থেকে / ফ্লোটে রূপান্তর করবে না।

10 এর নিকটতম একাধিকের সাথে গোলাকার:

>>> for n in range(-21, 30, 3): print('{:3d}  =>  {:3d}'.format(n, round_to_nearest(n, 10)))
-21  =>  -20
-18  =>  -20
-15  =>  -10
-12  =>  -10
 -9  =>  -10
 -6  =>  -10
 -3  =>    0
  0  =>    0
  3  =>    0
  6  =>   10
  9  =>   10
 12  =>   10
 15  =>   20
 18  =>   20
 21  =>   20
 24  =>   20
 27  =>   30

আপনি দেখতে পাচ্ছেন, এটি নেতিবাচক এবং ধনাত্মক উভয় সংখ্যার জন্য কাজ করে। টাই (যেমন -15 এবং 15) সর্বদা উপরের দিকে বৃত্তাকার হবে।

একটি অনুরূপ উদাহরণ যা 5 এর নিকটতম একাধিকের সাথে ঘুরে দেখা যায় যে এটি পৃথক "বেস" এর প্রত্যাশা অনুযায়ী আচরণ করে:

>>> for n in range(-21, 30, 3): print('{:3d}  =>  {:3d}'.format(n, round_to_nearest(n, 5)))
-21  =>  -20
-18  =>  -20
-15  =>  -15
-12  =>  -10
 -9  =>  -10
 -6  =>   -5
 -3  =>   -5
  0  =>    0
  3  =>    5
  6  =>    5
  9  =>   10
 12  =>   10
 15  =>   15
 18  =>   20
 21  =>   20
 24  =>   25
 27  =>   25

2

যদি কারও "আর্থিক রাউন্ডিং" প্রয়োজন হয় (0.5 রাউন্ড সবসময়ই আপ থাকে):

def myround(x, base=5):
    roundcontext = decimal.Context(rounding=decimal.ROUND_HALF_UP)
    decimal.setcontext(roundcontext)
    return int(base *float(decimal.Decimal(x/base).quantize(decimal.Decimal('0'))))

ডকুমেন্টেশন অনুসারে অন্যান্য গোলাকার বিকল্পগুলি হ'ল:

ROUND_CEILING (অনন্তের দিকে),
ROUND_DOWN (শূন্যের দিকে),
ROUND_FLOOR (-ইনফিনিটির দিকে),
ROUND_HALF_DOWN (নিকটে নিকটতম শূন্যের দিকে যাওয়ার),
ROUND_HALF_EVEN (নিকটতম এমনকি পূর্ণসংখ্যার
সাথে বন্ধনের সাথে ), ROUND_HALF_UP (সম্পর্কের নিকটে নিকটে শূন্য থেকে দূরে) বা
ROUND_UP (শূন্য থেকে দূরে)
ROUND_05UP (শূন্যের থেকে দূরে থাকলে শেষ সংখ্যাটি শূন্যের দিকে গোল করার পরে 0 বা 5 হত; অন্যথায় শূন্যের দিকে)

ডিফল্টরূপে পাইথন ROUND_HALF_EVEN ব্যবহার করে কারণ এতে কিছু পরিসংখ্যানগত সুবিধা রয়েছে (বৃত্তাকার ফলাফল পক্ষপাতদুষ্ট নয়)।


2

পূর্ণসংখ্যার জন্য এবং পাইথন 3 সহ:

def divround_down(value, step):
    return value//step*step


def divround_up(value, step):
    return (value+step-1)//step*step

উত্পাদন:

>>> [divround_down(x,5) for x in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [divround_up(x,5) for x in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]


1

পরবর্তী একাধিক 5

51 বিবেচনা করুন 55 এ রূপান্তর করা প্রয়োজন:

code here

mark = 51;
r = 100 - mark;
a = r%5;
new_mark = mark + a;

1

এই আমার সি কোড। আমি যদি এটি সঠিকভাবে বুঝতে পারি তবে এটি এমন কিছু হওয়া উচিত;

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        number++;
  printf("%d\n",number);
  }
}

এবং এটি কেবল গোলাকার পরিবর্তে 5 এর নিকটতম একাধিকের দিকেও ঘুরবে;

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        if (number%5 < 3)
            number--;
        else
        number++;
  printf("nearest multiple of 5 is: %d\n",number);
  }
}

1

এটি করার আরেকটি উপায় (সুস্পষ্ট গুণ বা বিভাগ অপারেটর ছাড়াই):

def rnd(x, b=5):
    return round(x + min(-(x % b), b - (x % b), key=abs))

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