كيف تجمع رقمًا في بيثون؟
-
23-09-2019 - |
سؤال
هذه المشكلة تقتلني. كيف يمكن لأحد الجولة رقمًا في بيثون؟
حاولت الجولة (الرقم) لكنها حول الرقم لأسفل. مثال:
round(2.3) = 2.0 and not 3, what I would like
لقد حاولت int (رقم + .5) ولكنه حول الرقم لأسفل مرة أخرى! مثال:
int(2.3 + .5) = 2
ثم حاولت الجولة (رقم + .5) لكنها لن تعمل في حالات الحافة. مثال:
WAIT! THIS WORKED!
يرجى تقديم النصيحة.
المحلول
ال سقف (السقف) الوظيفة:
import math
print(math.ceil(4.2))
نصائح أخرى
مشكلة مثيرة للاهتمام Python 2.x لتضع في الاعتبار:
>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0
المشكلة هي أن تقسيم اثنين ints في بيثون ينتج int آخر ويتم اقتطاعه قبل مكالمة السقف. عليك أن تجعل قيمة واحدة تعويم (أو يلقي) للحصول على نتيجة صحيحة.
في JavaScript ، ينتج نفس الرمز بالضبط نتيجة مختلفة:
console.log(Math.ceil(4500/1000));
5
أعلم أن هذه الإجابة هي لسؤال منذ فترة من الوقت ، ولكن إذا كنت لا تريد استيراد الرياضيات وتريد فقط أن تتجول ، فهذا يعمل بالنسبة لي.
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
يصبح الجزء الأول 4 ويقوم الجزء الثاني بتقييم "صحيح" إذا كان هناك ما تبقى ، بالإضافة إلى صحيح = 1 ؛ خطأ = 0. لذلك إذا لم يكن هناك ما تبقى ، فسيظل بنفس عدد صحيح ، ولكن إذا كان هناك ما تبقى ، فإنه يضيف 1.
إذا كنت تعمل مع الأعداد الصحيحة ، فإن إحدى طرق التقريب هي الاستفادة من حقيقة أن //
جولات لأسفل: فقط قم بالتقسيم على الرقم السلبي ، ثم نفي بالإجابة. لا استيراد أو نقطة عائمة أو مشروطة مطلوبة.
rounded_up = -(-numerator // denominator)
علي سبيل المثال:
>>> print(-(-101 // 5))
21
قد تحب أيضًا Numpy:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
أنا لا أقول أنه أفضل من الرياضيات ، ولكن إذا كنت تستخدم بالفعل Numpy لأغراض أخرى ، فيمكنك الحفاظ على رمزك ثابتًا.
على أي حال ، مجرد تفاصيل صادفتها. أستخدم Numpy كثيرًا وفوجئت أنه لم يتم ذكره ، ولكن بالطبع تعمل الإجابة المقبولة بشكل جيد تمامًا.
يستخدم math.ceil
بمحاصرة:
>>> import math
>>> math.ceil(5.4)
6.0
ملاحظة: يجب أن يكون المدخلات تعويم.
إذا كنت بحاجة إلى عدد صحيح ، اتصل int
لتحويله:
>>> int(math.ceil(5.4))
6
راجع للشغل ، استخدام math.floor
لجولة تحت و round
إلى جولة إلى أقرب عدد صحيح.
>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)
قد لا يكون بناء الجملة من قبل المرء كما قد يرغب المرء ، لكنه مكتبة قوية.
https://docs.python.org/2/library/decimal.html
from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
أنا مندهش من أحد اقترح
(numerator + denominator - 1) // denominator
لتقسيم عدد صحيح مع تقريب. اعتاد أن تكون الطريقة الشائعة لـ C/C ++/CUDA (راجع divup
)
يجب أن تكون القيمة المدورة
a = 8
b = 21
print math.ceil(a / b)
>>> 0
لكن
print math.ceil(float(a) / b)
>>> 1.0
جرب هذا:
a = 211.0
print(int(a) + ((int(a) - a) != 0))
الإجابات أعلاه صحيحة ، ومع ذلك ، استيراد math
الوحدة النمطية فقط لهذه الوظيفة الواحدة عادة ما تبدو وكأنها مبالغة بالنسبة لي. لحسن الحظ ، هناك طريقة أخرى للقيام بذلك:
g = 7/5
g = int(g) + (not g.is_integer())
True
و False
يتم تفسيرها على أنها 1
و 0
في بيان يتضمن أرقام في بيثون. g.is_interger()
يترجم أساسا إلى g.has_no_decimal()
أو g == int(g)
. لذا فإن البيان الأخير في اللغة الإنجليزية يقرأ round g down and add one if g has decimal
.
دون استيراد الرياضيات // باستخدام البيئة الأساسية:
أ) طريقة / طريقة الفئة
def ceil(fl):
return int(fl) + (1 if fl-int(fl) else 0)
def ceil(self, fl):
return int(fl) + (1 if fl-int(fl) else 0)
ب) لامدا:
ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
>>> def roundup(number):
... return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
هذه الوظيفة لا تتطلب الوحدات النمطية.
لأولئك الذين يريدون التقريب a / b
والحصول على عدد صحيح:
متغير آخر باستخدام تقسيم عدد صحيح
def int_ceil(a, b):
return (a - 1) // b + 1
>>> int_ceil(19, 5)
4
>>> int_ceil(20, 5)
4
>>> int_ceil(21, 5)
5
أنا مندهش لأنني لم أر هذا الإجابة بعد round(x + 0.4999)
, ، لذلك سأضعه. لاحظ أن هذا يعمل مع أي نسخة بيثون. جعلت التغييرات التي تم إجراؤها على مخطط تقريب الثعبان الأمور صعبة. انظر الى هذا بريد.
دون الاستيراد ، أنا أستخدم:
def roundUp(num):
return round(num + 0.49)
testCases = list(x*0.1 for x in range(0, 50))
print(testCases)
for test in testCases:
print("{:5.2f} -> {:5.2f}".format(test, roundUp(test)))
لماذا هذا يعمل
من المستندات
بالنسبة للأنواع المدمجة الداعمة الجولة () ، يتم تقريب القيم إلى أقرب مضاعف من 10 إلى Power Minus N ؛ إذا كانت مضاعفتان قريبة على قدم المساواة ، فسيتم إجراء التقريب نحو الاختيار الزوجي
لذلك يتم تقريب 2.5 إلى 2 و 3.5 يتم تقريبه إلى 4. إذا لم يكن الأمر كذلك ، فيمكن إجراء التقريب عن طريق إضافة 0.5 ، لكننا نريد تجنب الوصول إلى نقطة منتصف الطريق. لذا ، إذا قمت بإضافة 0.4999 ، فستقترب ، ولكن مع الهامش الكافي ليتم تقريبه لما تتوقعه عادة. بالطبع ، سوف يفشل هذا إذا كان x + 0.4999
يساوي [n].5000
, ، لكن هذا غير مرجح.
للقيام بذلك دون أي استيراد:
>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3
أعلم أن هذا منذ فترة طويلة ، لكنني وجدت إجابة مثيرة للاهتمام للغاية ، لذلك هنا يذهب:
-round(-x-0.5)
هذا يعمل على إصلاح حالات الحواف ويعمل مع كل من الأرقام الإيجابية والسلبية ، ولا يتطلب أي وظائف استيراد
هتافات
عندما تدير 4500/1000 في Python ، ستكون النتيجة 4 ، لأنه بالنسبة إلى Python الافتراضي كصاحب عدد صحيح ، من الناحية المنطقية: 4500/1000 = 4.5 -> int (4.5) = 4 وسقف 4 واضح هو 4
باستخدام 4500/1000.0 ، ستكون النتيجة 4.5 وسقف من 4.5 -> 5
باستخدام JavaScript ، ستتلقى 4.5 نتيجة 4500/1000 ، لأن JavaScript asume فقط نتيجة "النوع الرقمي" وإرجاع نتيجة مباشرة مثل تعويم
حظا طيبا وفقك الله!!
إذا كنت لا ترغب في استيراد أي شيء ، فيمكنك دائمًا كتابة وظيفتك البسيطة على النحو التالي:
def RoundUP(num):
if num== int(num):
return num
return int(num + 1)
يمكنك استخدام Devision الأرضية وإضافة 1 إليها. 2.3 // 2 + 1
أعتقد أنك تخلط بين آليات العمل بين int()
و round()
.
int()
يقتطه دائمًا الأرقام العشرية إذا تم إعطاء رقم عائم ؛ بينما round()
, ، في حالة 2.5
أين 2
و 3
كلاهما على قدم المساواة من 2.5
, ، يعيد بيثون أيهما أكثر من 0 من النقطة.
round(2.5) = 3
int(2.5) = 2
حصتي
لقد اختبرت print(-(-101 // 5)) = 21
مثال معين أعلاه.
الآن للتجميع:
101 * 19% = 19.19
لا أستطيع استخدام **
لذلك قمت بنشر الضرب إلى الانقسام:
(-(-101 //(1/0.19))) = 20
https://docs.python.org/2/library/math.htmlابحث عن الرياضيات
"أعد سقف X كتعويم ، أصغر قيمة عدد صحيح أكبر من أو تساوي x."
أنا في الأساس مبتدئ في بيثون ، ولكن إذا كنت تحاول فقط التقريب بدلاً من عدم القيام بذلك:
round(integer) + 1