سؤال

هذه المشكلة تقتلني. كيف يمكن لأحد الجولة رقمًا في بيثون؟

حاولت الجولة (الرقم) لكنها حول الرقم لأسفل. مثال:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top