নিকটতম পূর্ণসংখ্যার বৃত্তাকার সংখ্যা


229

আমি দীর্ঘ ভাসমান সংখ্যার মতো গোল করার চেষ্টা করছিলাম:

32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...

এখন পর্যন্ত কোনও সাফল্য নেই। আমি চেষ্টা করেছিলাম math.ceil(x), math.floor(x)(যদিও এটি চূড়ান্ত বা নিচে হবে, যা আমি খুঁজছি round(x)তা নয় ) এবং যা কোনও কাজ করে না (এখনও সংখ্যাগুলি ভাসিয়ে দেয়)।

আমি কি করতে পারে?

সম্পাদনা: কোড:

for i in widthRange:
    for j in heightRange:
        r, g, b = rgb_im.getpixel((i, j))
        h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
        h = h * 360
        int(round(h))
        print(h)

3
আমি চেষ্টা করবোint(x)
দ্য ব্রোফেসার

এটা কি ত্রুটি দেয় না? বেস 10 সহ int () এর জন্য অবৈধ আক্ষরিক:
snh_nl

উত্তর:


366
int(round(x))

এটি গোল করে এটি পূর্ণসংখ্যায় পরিবর্তন করবে

সম্পাদনা করুন:

আপনি কোনও ভেরিয়েবলের জন্য int (বৃত্তাকার (h)) বরাদ্দ দিচ্ছেন না। আপনি যখন ইনট (বৃত্তাকার (এইচ)) কল করেন, এটি পূর্ণসংখ্যার নম্বরটি দেয় কিন্তু অন্য কিছুই করে না; আপনাকে এই লাইনটি পরিবর্তন করতে হবে:

h = int(round(h))

H- তে নতুন মান নির্ধারণ করতে

সম্পাদনা 2:

@ প্লোম্যান মন্তব্যে যেমন বলেছিলেন, পাইথনের round()কাজটি সাধারণভাবে প্রত্যাশা মতো কাজ করে না, এবং এটি কারণ যে সংখ্যাটি ভেরিয়েবল হিসাবে সংরক্ষণ করা হয় তা সাধারণত আপনি পর্দায় দেখেননি। এমন অনেক উত্তর রয়েছে যা এই আচরণটি ব্যাখ্যা করে:

গোল () সঠিকভাবে গোল হয় না বলে মনে হচ্ছে

এই সমস্যাটি এড়ানোর এক উপায় হ'ল এই উত্তর দ্বারা বর্ণিত দশমিকটি ব্যবহার করা: https://stackoverflow.com/a/15398691/4345659

অতিরিক্ত লাইব্রেরি ব্যবহার না করে এই উত্তরটি সঠিকভাবে কাজ করার জন্য কাস্টম রাউন্ডিং ফাংশনটি ব্যবহার করা সুবিধাজনক হবে। অনেক সংশোধন করার পরে, আমি নিম্নলিখিত সমাধানটি নিয়ে এসেছি, আমি যতদূর পরীক্ষা করেছি সমস্ত স্টোরিংয়ের সমস্যা এড়িয়ে চলেছি। এটি স্ট্রিং উপস্থাপনা ব্যবহারের উপর ভিত্তি করে প্রাপ্ত repr()(নয় str()!) দিয়ে প্রাপ্ত । এটি হ্যাকি লাগছে তবে সমস্ত কেস সমাধান করার জন্য এটিই একমাত্র উপায়। এটি পাইথন 2 এবং পাইথন 3 উভয়ের সাথে কাজ করে।

def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
        return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
    return float(num[:-1])

পরীক্ষা:

>>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>> 
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0

শেষ অবধি, সঠিক উত্তরটি হ'ল:

# Having proper_round defined as previously stated
h = int(proper_round(h))

সম্পাদনা 3:

পরীক্ষা:

>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1  # should be 7

এখানে গ্যাচা হচ্ছে যে- decদশম দশমিক 9 হতে পারে এবং dec+1চতুর্থ সংখ্যা> = 5 হলে 9টি 0 হয়ে যায় এবং 1 টি- dec-1তম সংখ্যায় নিয়ে যাওয়া উচিত ।

আমরা যদি এটি বিবেচনায় নিই তবে আমরা পাই:

def proper_round(num, dec=0):
    num = str(num)[:str(num).index('.')+dec+2]
    if num[-1]>='5':
      a = num[:-2-(not dec)]       # integer part
      b = int(num[-2-(not dec)])+1 # decimal part
      return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
    return float(num[:-1])

উপরে বর্ণিত পরিস্থিতিতে b = 10এবং পূর্ববর্তী সংস্করণটি কেবল সংমিশ্রিত হবে aএবং এর bফলাফল 10যেখানে 0 টি অদৃশ্য হয়ে যাবে তার একযোগে পরিণত হবে। এই সংস্করণটি যথাযথ বহন হিসাবে bভিত্তিতে ডান দশমিক স্থানে রূপান্তরিত decকরে।


2
মুদ্রণ ("4.5)", ইনট (বৃত্তাকার (4.5)) # আমাকে 4 টি মুদ্রণ দিয়েছে ("5.5)", ইনট (বৃত্তাকার (5.5))) # আমাকে 6 দিয়েছে
:,

এটি পাইথন সংস্করণের সাথে সম্পর্কিত। এটি পাইথন ২.7.৯ ব্যবহার করে আমাকে ৫ এবং gives দেয় এবং যেমনটি আপনি বলেছেন, ৪ এবং
Py

1
লক্ষণীয় মূল্য: এই সমাধানটি সম্ভবত আপনি যেভাবে প্রত্যাশা করছেন সেভাবে চলবে না। উদাহরণস্বরূপ, int(round(4.5))4 টি রাউন্ড ডাউন হয়ে int(round(4.500001))সঠিকভাবে 5 এ রাউন্ড করুন
লাঙ্গমান

অল্প বয়স্ক যদি পূর্ণসংখ্যার চায় তবে round(x)পাইথন ৩.6.২ এ যথেষ্ট (এবং এটিও কম সংস্করণে থাকতে পারে)। ফলাফল ইতিমধ্যে int টাইপ। দ্রষ্টব্য: round(x, n)টাইপ ফ্লোট হবে।
Elmex80s

1
এটি 112439.50093565206 এর জন্য কাজ করে না। এটি দেয় </ p -> 11253.0। অদ্ভুত অদ্ভুত .. !!!!
আজিন

24

ব্যবহার round(x, y)। এটি আপনার পছন্দসই দশমিক স্থানে আপনার সংখ্যাটি বাড়িয়ে তুলবে।

উদাহরণ স্বরূপ:

>>> round(32.268907563, 3)
32.269

20

round(value,significantDigit)সাধারণ সমাধান, তবে এটি কার্যকর হয় না যেমন একটি গণিতের দৃষ্টিকোণ থেকে আশা করা হয় যখন বৃত্তাকার মানগুলি শেষ হয় 5। যদি 5আপনি অঙ্কিত হয় তার ঠিক পরে যদি অঙ্কটিতে থাকে তবে এই মানগুলি কখনও কখনও প্রত্যাশার মতোই বৃত্তাকার হয়ে যায় (অর্থাত্ 8.005দুটি দশমিক অঙ্ক দেয় 8.01)। ভাসমান পয়েন্ট গণিতের কীর্তির কারণে নির্দিষ্ট মানগুলির জন্য, সেগুলি পরিবর্তে গোল হয়!

অর্থাত

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

রহস্যময়।

আপনার অভিপ্রায়টি ধরে নেওয়া বিজ্ঞানের পরিসংখ্যানগুলির জন্য traditionalতিহ্যবাহী বৃত্তাকারী করা, এটি অতিরিক্ত স্টাফের মতো roundপ্রয়োজন হিসাবে ফাংশনটি কাজ করার জন্য একটি সহজ মোড়ক ।importDecimal

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*5),2)

0.08

আহা! সুতরাং এর ভিত্তিতে আমরা একটি ফাংশন করতে পারি ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

মূলত এটির সাথে আপনি যে স্ট্রিংটি ব্যবহার roundকরার চেষ্টা করছেন তার সর্বনিম্ন প্রদত্ত অঙ্কের চেয়ে ছোট হওয়ার গ্যারান্টিযুক্ত একটি মান যুক্ত হয়। অল্প পরিমাণ যুক্ত করে এটি roundবেশিরভাগ ক্ষেত্রেই এর আচরণ সংরক্ষণ করে , এখন এটি নিশ্চিত করছে যে যদি গোলটির সাথে সংখ্যার নিকৃষ্ট মানের 5এটি গোল হয়, এবং এটি যদি 4গোল হয় তবে এটি গোল হয়।

ব্যবহারের পদ্ধতির 10**(-len(val)-1)যেমন বৃহত্তম অল্প সংখ্যক আপনি শিফট বলপূর্বক, যখন এছাড়াও নিশ্চিত যে মান কখনো যোগ এমনকি rounding যদি দশমিক পরিবর্তন যোগ করতে পারেন, ইচ্ছাকৃত ছিল .অনুপস্থিত। আমি আরও বিয়োগের জন্য কেবলমাত্র 10**(-len(val))একটি কনডিডিশনাল দিয়ে ব্যবহার করতে পারি ... তবে কেবল সর্বদা বিয়োগ করা সহজ যেটি এই দশমিক সংখ্যার প্রযোজ্য পরিসীমাটিকে পরিবর্তিত করবে না যা এই কর্মক্ষেত্রটি সঠিকভাবে পরিচালনা করতে পারে। আপনার মানগুলি ধরণের সীমাতে পৌঁছে গেলে এই পদ্ধতিটি ব্যর্থ হবে, এটি ব্যর্থ হবে তবে বৈধ দশমিক মানের প্রায় পুরো পরিসরের জন্য এটি কাজ করা উচিত।if (val>1)11

এটি সম্পাদন করার জন্য আপনি দশমিক লাইব্রেরিটিও ব্যবহার করতে পারেন তবে আমার প্রস্তাবিত মোড়কটি সহজ এবং কিছু ক্ষেত্রে পছন্দসই হতে পারে।


সম্পাদনা করুন: ব্লিংকংহিট ধন্যবাদ জানানোর জন্য যে 5ফ্রিঞ্জ কেসটি কেবলমাত্র কয়েকটি মানের জন্য ঘটে occurs এছাড়াও এই উত্তরের পূর্ববর্তী সংস্করণটি এতটা স্পষ্ট ছিল না যে বিজোড় রাউন্ডিং আচরণটি তখনই ঘটে যখন আপনি যে অঙ্কটির সাথে গোল করে যাচ্ছেন তা অবিলম্বে অঙ্কটি নিকৃষ্ট হয়5


আমি নিশ্চিত না যে আপনি কেন দশমিকের সাথে 5শেষ সংখ্যা হিসাবে সর্বদা বাদ পড়বেন think এটা একটা দ্রুত পরীক্ষা আমি শুধু মত সংখ্যার করেনি মামলা নয় 1.5, 2.5, 3.5এবং তাই এবং 1.05, 1.15, 1.25, 1.35এক দশমিক জায়গা মানে প্রকাশ করে। প্রথম সেটটি (ছোট ছোট পূর্ণসংখ্যার অবধি ঠিক অর্ধেক অংশ) সর্বদা সমান পূর্ণসংখ্যার জন্য বৃত্তাকার। পরবর্তী সেটটি ধারাবাহিকভাবে গোল হয় না, সম্ভবত কিছু মানের অসাধারণ বাইনারি উপস্থাপনার কারণে। 1.25রাউন্ডের মতো যথাযথ বাইনারি উপস্থাপনাগুলি রয়েছে এমন ভাসমানগুলির মধ্যে এমনকি একটি কমপক্ষে উল্লেখযোগ্য অঙ্ক থাকে তবে অন্যরা এলোমেলোভাবে গোল হয়ে আসে।
ব্ল্যাকঙ্কহট

আকর্ষণীয় ... আপনি ঠিক বলেছেন। round(4.0005,3)দেয় 4.0এবং round(1.0005,3)দেয় 1.0, কিন্তু round(2.0005,3)দেয় 2.001এবং round(3.0005,3)দেয় 3.001। তবে ঠিক এই কারণেই আমার প্রস্তাবিত সমাধানটি প্রয়োজনীয় ... আপনি জানেন না যে এই গুরুত্বপূর্ণ ক্ষেত্রে স্টক রাউন্ড থেকে কী আশা করা যায়!
জেসন আর। মিক

এর জন্য ধন্যবাদ. এই সমস্যাটি উপস্থিত হলে আপনার ফাংশনটি কাজে আসবে।
TMWP

1
আপনি কি , digitsরিটার্নের স্টেটমেন্ট শেষে এসেছেন? কোন পাং উদ্দেশ্য। (যার অর্থ আমার অর্থ)
ব্যবহারকারীর 34342816

আহ ঠিক আছে, আসলে সেখানে থাকা উচিত ছিল। ভাল ধরা ... অবাক আর কারও নজরে পড়েনি! যারা সমাধানটি কিছুটা হতাশাকে কাজে লাগান তাদের বাঁচাবে। :-)
জেসন আর। মিক

15

ইতিবাচক জন্য, চেষ্টা করুন

int(x + 0.5)

নেতিবাচকদের জন্যও এটি কার্যকর করতে, চেষ্টা করুন

int(x + (0.5 if x > 0 else -0.5))

int()একটি মেঝে ফাংশন মত কাজ করে এবং তাই আপনি এই সম্পত্তি শোষণ করতে পারেন। এটি অবশ্যই দ্রুততম উপায়।


4
নেতিবাচকদের জন্য কাজ করে না>>> x=-0.999 >>> int(x), round(x), int(x+0.5) (0, -1.0, 0)
user2907934

3
আপনি যদি কোণার কেসগুলির বিষয়ে যত্নশীল হন তবে "0.5 এবং তল যুক্ত করুন" কৌশলটি ব্যবহার করবেন না - এমন কিছু মান রয়েছে যা আপনার প্রত্যাশার মতো নয়! সি ++ টেকের জন্য স্ট্যাকওভারফ্লো.com/ a/ 47302585/2732969 দেখুন এবং এই খুব প্রশ্নের মধ্যে স্ট্যাকওভারফ্লো . com/ a/ 38744026/2732969 উত্তর দেখুন।
আনন

আমার একটি দ্রুত পদ্ধতি প্রয়োজন, এটি সঠিক হতে হবে না এবং অনেকগুলি কর্নার কেসগুলি নাও থাকত এবং কর্নারের ক্ষেত্রে ত্রুটিটি আমার দৃশ্যে গুরুত্বপূর্ণ নয়। সুতরাং এটি অবশ্যই স্পেশাল কিছু ক্ষেত্রে যাব যেখানে গতি অগ্রাধিকার পাবে। নির্ভুলতা বা নির্ভুলতার জন্য সুপারিশ করবেন না।
এজেন্টএম

11

আইইইই 754 দ্বারা নির্ধারিত কেবল পাইথন রাউন্ড অর্ধেকটি সমান করে না ?

পুনরায় সংজ্ঞায়নের বিষয়ে সতর্কতা অবলম্বন করুন, বা "অ-মানক" বৃত্তাকার ব্যবহার করুন ...

( Https://stackoverflow.com/a/33019948/109839 দেখুন )


2
এই উত্তরটি কিছুটা অস্পষ্ট। Round half to evenআইইইই 754 দ্বারা একেবারে নির্ধারিত নয়, পরিবর্তে স্ট্যান্ডার্ড দ্বারা বর্ণিত কয়েকটি গোলাকার বিকল্পগুলির মধ্যে একটিRound to nearest, ties away from zero(অর্থাৎ বেশিরভাগ লোকেরা যে আচরণটি প্রত্যাশা করে) এটিও একটি বিকল্প এবং এটি ডিফল্ট, উদাহরণস্বরূপ, সি / সি ++।
টেল

আমি একমত, শব্দটি বেশ বিভ্রান্তিকর। আমার অর্থ কী ছিল যে পাইথন অর্ধেকটি গোল করে হেভেন হয়ে গেছে (ডকস.পিথন.অর্গ.৩৩.৩ / লাইব্রেরির শেষে টেবিলটি দেখুন যেখানে roundব্যাখ্যা করা হয়েছে) এবং এটি "গোল অর্ধ থেকে সমান" নির্ধারিত পদ্ধতি অনুসারে এটি করছে মান দ্বারা কাজ (বা বর্ণিত)।
ম্যাপিও

8

আপনি যদি পাইথন 3.x ব্যবহার করছেন তবে এখানে নমুনা ধরে ধরেও ব্যবহার করতে পারেন এটির একটি উদাহরণ

import numpy as np
x = 2.3
print(np.rint(x))
>>> 2.0

7

আপনার সমাধানটি দ্বিতীয় যুক্তি (দশমিক জায়গার সংখ্যা) নির্দিষ্ট না করেই ডাকছে

>>> round(0.44)
0
>>> round(0.64)
1

যা তুলনায় অনেক ভাল ফলাফল

>>> int(round(0.44, 2))
0
>>> int(round(0.64, 2))
0

পাইথন ডকুমেন্টেশন থেকে https://docs.python.org/3/library/function.html#round এ

গোল (সংখ্যা [, এনডিজিট])

দশমিক বিন্দুর পরে এনডিগটস নির্ভুলতায় গোলাকার রিটার্ন নম্বর। যদি এনডিজিটগুলি বাদ দেওয়া হয় বা কোনওটি না হয় তবে এটি তার ইনপুটটিতে নিকটতম পূর্ণসংখ্যাকে প্রদান করে।

বিঃদ্রঃ

ভাসমানগুলির জন্য বৃত্তাকার () এর আচরণ অবাক করে দিতে পারে: উদাহরণস্বরূপ, বৃত্তাকার (2.675, 2) প্রত্যাশিত 2.68 এর পরিবর্তে 2.67 দেয়। এটি কোনও ত্রুটি নয়: এটি বেশিরভাগ দশমিক ভগ্নাংশকে ঠিক ভাসা হিসাবে উপস্থাপন করা যায় না এর ফলস্বরূপ। ভাসমান পয়েন্ট গণিত দেখুন: আরও তথ্যের জন্য সমস্যা এবং সীমাবদ্ধতা।


1

যদি আপনার প্রয়োজন হয় (উদাহরণস্বরূপ) A এর জন্য দুই অঙ্কের অনুমানের প্রয়োজন হয়, তবে int(A*100+0.5)/100.0আপনি যা খুঁজছেন তা করবে।

আপনার যদি তিন ডিজিটের প্রায় অনুমানের প্রয়োজন হয় তবে 1000 এবং আরও কিছু দিয়ে ভাগ করুন।


1

এই জাতীয় কিছু কাজ করা উচিত

import numpy as np    

def proper_round(a):
    '''
    given any real number 'a' returns an integer closest to 'a'
    '''
    a_ceil = np.ceil(a)
    a_floor = np.floor(a)
    if np.abs(a_ceil - a) < np.abs(a_floor - a):
        return int(a_ceil)
    else:
        return int(a_floor)

0

এই উদ্দেশ্যে আমি কেবল নিম্নলিখিত কাজটি করার পরামর্শ দিচ্ছি -

int(round(x))

এটি আপনাকে নিকটতম পূর্ণসংখ্যা দেবে।

আশাকরি এটা সাহায্য করবে!!


0

আমি নিম্নলিখিত সমাধানটি ব্যবহার করতে পারি এবং পরামর্শ দিতে পারি (পাইথন ৩..6):

y = int(x + (x % (1 if x >= 0 else -1)))

এটি অর্ধ-সংখ্যার (ধনাত্মক এবং sণাত্মক) জন্য সূক্ষ্ম কাজ করে এবং int (বৃত্তাকার (x)) এর চেয়েও দ্রুত কাজ করে:

round_methods = [lambda x: int(round(x)), 
                 lambda x: int(x + (x % (1 if x >= 0 else -1))),
                 lambda x: np.rint(x).astype(int),
                 lambda x: int(proper_round(x))]

for rm in round_methods:
    %timeit rm(112.5)
Out:
201 ns ± 3.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
159 ns ± 0.646 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
925 ns ± 7.66 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.18 µs ± 8.66 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

for rm in round_methods:
    print(rm(112.4), rm(112.5), rm(112.6))
    print(rm(-12.4), rm(-12.5), rm(-12.6))
    print('=' * 11)

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