आप पायथन में यूपी का एक नंबर कैसे गोल करेंगे?


486

यह समस्या मुझे मार रही है। पायथन में एक राउंडअप एक नंबर यूपी कैसे करता है?

मैंने राउंड (संख्या) की कोशिश की, लेकिन यह संख्या नीचे हो गई। उदाहरण:

round(2.3) = 2.0 and not 3, what I would like

मैंने int (संख्या + .5) की कोशिश की लेकिन यह फिर से नीचे संख्या को गोल करता है! उदाहरण:

int(2.3 + .5) = 2

फिर मैंने राउंड (संख्या + .5) की कोशिश की, लेकिन यह बढ़त के मामलों में काम नहीं करेगा। उदाहरण:

WAIT! THIS WORKED!

कृपया सलाह दें।


4
round(number + .5)यदि संख्या पूर्णांक है तो काम नहीं करता है। round(3+.5) == 4, जब आप वास्तव में चाहते हैं 3
नीरु

जवाबों:


844

प्लस्तर लगाना (छत) समारोह:

import math
print(math.ceil(4.2))

21
विस्तार: math.ceil सबसे छोटा पूर्णांक देता है जो इनपुट मान से अधिक या उसके बराबर होता है। यह फ़ंक्शन इनपुट को एक फ्लोट के रूप में मानता है (पायथन में दृढ़ता से टाइप किए गए चर नहीं हैं) और फ़ंक्शन एक फ्लोट देता है। यदि आप एक इंट चाहते हैं, तो आप रिटर्न वैल्यू से एक इंट का निर्माण कर सकते हैं, अर्थातint(math.ceil(363))
RW सिननेट

9
@ साइननेट: वास्तव में कोई यह कह सकता है कि अजगर दृढ़ता से टाइप किया गया है stackoverflow.com/a/11328980/5069869
बर्नहार्ड

1
@ Thespinosa: हाँ, अजगर निश्चित रूप से दृढ़ता से टाइप किया जाता है, बस इसके कई कार्य कुछ मापदंडों के प्रकार के बारे में प्रश्न पूछते हैं और उत्तर के आधार पर विभिन्न कोड निष्पादित करते हैं।
क़मराना

12
@RWSinnet पायथन 3 में, math.ceilपूर्णांक मान के साथ फ्लोटिंग ऑब्जेक्ट न केवल एक वास्तविक पूर्णांक ऑब्जेक्ट देता है।
आर्थर टाका

फ्लोट 10000000 * 0.00136 = 13600.000000000002math.ceil(10000000 * 0.00136) = 13601.0
प्रिसिजन का ख्याल रखें, सीलिंग की

170

मुझे पता है कि यह उत्तर थोड़ी देर से एक प्रश्न के लिए है, लेकिन अगर आप गणित को आयात नहीं करना चाहते हैं और आप केवल गोल करना चाहते हैं, तो यह मेरे लिए काम करता है।

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

पहला भाग 4 हो जाता है और दूसरा भाग शेष होने पर "सत्य" का मूल्यांकन करता है, जो कि सत्य 1 = 1 के अतिरिक्त है; मिथ्या = 0. इसलिए यदि कोई शेष नहीं है, तो यह एक ही पूर्णांक रहता है, लेकिन यदि शेष है तो यह 1 जोड़ता है।


38
अच्छा लगा। आप //पूर्णांक विभाजन के लिए भी उपयोग कर सकते हैं , इसलिए यह बन जाता है 21 // 5 + (21 % 5 > 0)
n

6
यह सबसे अच्छा समाधान है यदि केवल पूर्णांक शामिल हैं। कोई अनावश्यक floatएस। अच्छा लगा।
निको श्लोमर

158

दिलचस्प पायथन 2.x मुद्दा ध्यान में रखने के लिए:

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

समस्या यह है कि अजगर में दो चींटियों को विभाजित करने से एक और अंतर पैदा होता है और जिसे छत कॉल से पहले काट दिया जाता है। आपको एक सही परिणाम प्राप्त करने के लिए एक मान एक फ्लोट (या कास्ट) बनाना होगा।

जावास्क्रिप्ट में, एक ही कोड एक अलग परिणाम उत्पन्न करता है:

console.log(Math.ceil(4500/1000));
5

44
में अजगर 2.x : पूर्णांक / पूर्णांक -> पूर्णांक और पूर्णांक / नाव -> नाव में अजगर 3.x : पूर्णांक / पूर्णांक एक नाव में परिणाम कर सकते
gecco

7
आप पायथॉन 3.x को व्यवहार के कुछ संस्करणों पर प्राप्त कर सकते हैं। 2.x "असली विभाजन" को सक्षम करके जैसा कि यहाँ
रोब डेनिस

110

यदि पूर्णांकों के साथ काम कर रहे हैं, तो राउंडिंग का एक तरीका इस तथ्य का लाभ उठाना है कि //नीचे गोल है: बस नकारात्मक संख्या पर विभाजन करें, फिर उत्तर को नकार दें। कोई आयात, फ्लोटिंग पॉइंट, या सशर्त ज़रूरत नहीं।

rounded_up = -(-numerator // denominator)

उदाहरण के लिए:

>>> print(-(-101 // 5))
21

1
जब आपको किसी भी गणित ऑपरेशन को करने की आवश्यकता नहीं है, तब क्या होगा? यानी आपके पास सिर्फ एक नंबर है।
क्लीक

2
@ कालिक: तो आप बस 1 ==> - (-num // 1) से विभाजित कर सकते हैं और आपको अपना उत्तर मिल रहा है :-) आपका दिन शुभ हो! डेविड बाऊ: बहुत अच्छा प्रस्ताव!
मार्को 8

10
मैंने यहां सभी उत्तरों को समयबद्ध किया और यह अगले सर्वश्रेष्ठ (math.ceil) से पांच गुना तेज था। @Andreas का एक ही समय था
मिनी टोटेंट

@minitotent यह सरल पूर्णांक विभाजन और एकल-चक्र संचालन के एक जोड़े के बाद से आश्चर्य की बात नहीं है। यह उस तरह का उत्तर है जो आपको नौकरी देता है: न केवल भाषा को समझना, बल्कि इसके नीचे के सार की सभी परतें।
नीरु

अच्छा! मैंने हमेशा उपयोग किया है (num + den - 1) // den, जो intसकारात्मक हर के साथ इनपुट के लिए ठीक है, लेकिन विफल रहता है अगर एक भी गैर-अभिन्न floatशामिल है (या तो अंश या भाजक); यह अधिक जादुई लग रही है, लेकिन दोनों intएस और floatएस के लिए काम करता है । छोटे अंशधारियों के लिए, यह तेज़ (CPython 3.7.2 पर) है, हालांकि अजीब तरह से, जब केवल अंश बड़ा होता है, तो सरणी आधारित गणित की आवश्यकता होती है, आपका दृष्टिकोण धीमा होता है; यह स्पष्ट नहीं है कि ऐसा क्यों है, क्योंकि विभाजन का काम समान होना चाहिए और दो एकात्मक नकारात्मक जोड़ + घटाव से सस्ता होना चाहिए।
शैडो रेंजर

56

तुम भी सुन्न पसंद कर सकते हैं:

>>> import numpy as np
>>> np.ceil(2.3)
3.0

मैं यह नहीं कह रहा हूं कि यह गणित से बेहतर है, लेकिन यदि आप पहले से ही अन्य उद्देश्यों के लिए सुन्न का उपयोग कर रहे हैं, तो आप अपने कोड को सुसंगत रख सकते हैं।

वैसे भी, बस एक विस्तार मैं भर आया। मैं बहुत उपयोग करता हूं और आश्चर्यचकित था कि इसका उल्लेख नहीं किया गया था, लेकिन निश्चित रूप से स्वीकृत जवाब पूरी तरह से ठीक काम करता है।


3
सुन्न का उपयोग करना भी अच्छा है। सबसे आसान गणित के साथ होगा क्योंकि यह पहले से ही पुस्तकालयों में निर्मित अजगर का हिस्सा है। यह अधिक समझ में आता है। इसके बजाय जैसा कि आपने उल्लेख किया है कि यदि आप अन्य मुद्दों के लिए बहुत अधिक मात्रा का उपयोग करते हैं, तो यह समझ में आता है और numpy.ceil का उपयोग करने के लिए सुसंगत है :-) अच्छा संकेत!
मार्को 8

30

math.ceilराउंड अप करने के लिए उपयोग करें :

>>> import math
>>> math.ceil(5.4)
6.0

नोट : इनपुट फ्लोट होना चाहिए।

यदि आपको पूर्णांक की आवश्यकता है, तो intइसे बदलने के लिए कॉल करें :

>>> int(math.ceil(5.4))
6

BTW, 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)

1
अजगर जरूरी 3 का उपयोग करने पर इनपुट को एक फ्लोट होने की आवश्यकता नहीं है: आंतरिक रूप ceil() से इसका ध्यान
रखेगा

12

वाक्य-विन्यास जितना हो सकता है उतना पाइथोनिक नहीं हो सकता है, लेकिन यह एक शक्तिशाली पुस्तकालय है।

https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))

11

मुझे आश्चर्य है कि किसी ने सुझाव नहीं दिया

(numerator + denominator - 1) // denominator

पूर्णांक के साथ पूर्णांक विभाजन के लिए। C / C ++ / CUDA (cf. divup) के लिए सामान्य तरीका हुआ करता था


2
केवल वैधानिक रूप से टाइप की गई भाषाओं के लिए प्रासंगिक। यदि भाजक एक नाव है तो आप मर चुके हैं।
भारेल

यह भी केवल लगातार काम करता है यदि भाजक सकारात्मक है; यदि भाजक नकारात्मक है, तो आपको 1इसे घटाने के बजाय जोड़ने की आवश्यकता है , या गणित करने से पहले अंश और भाजक दोनों के संकेतों को फ्लिप करना होगा।
शैडो रेंजर

7

होना shure गोल मूल्य फ्लोट होना चाहिए

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

परंतु

print math.ceil(float(a) / b)
>>> 1.0

6

इसे इस्तेमाल करे:

a = 211.0
print(int(a) + ((int(a) - a) != 0))

1
चतुर। ((int(a) - a) != 0)अभिव्यक्ति रिटर्न 1जब भी aजरूरत को गिरफ्तार किया जाना है। आप अपने उत्तर का विस्तार करना चाहते हैं और समझा सकते हैं कि यह कैसे काम करता है।
टॉम अरंडा

@TomAranda क्या कोई बता सकता है कि एक बूलियन एक्सप्रेशन किसी वैल्यू का मूल्यांकन कैसे करता है?
बोउन लियू

6
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

इस फ़ंक्शन के लिए किसी मॉड्यूल की आवश्यकता नहीं है।


यदि आपकी संख्या क्या है 3, तो यह उस समय तक होगा 4जब कोई व्यक्ति चाहे या नहीं हो सकता है
buydadip

15
यह केवल 99% मामलों में काम करता है। आपने ठीक से नहीं सोचा। इस तरह के समाधान को हर कीमत पर बचा जाना चाहिए।
नीरु

इसलिए +5 के बजाय +49999999 मेरे लिए काफी अच्छा है।
फ्लाइंगज़ेब्रा 1

5

उपरोक्त उत्तर सही हैं, हालांकि, mathइस एक फ़ंक्शन के लिए मॉड्यूल का आयात करना आमतौर पर मेरे लिए एक ओवरकिल की तरह महसूस होता है। सौभाग्य से, इसे करने का एक और तरीका है:

g = 7/5
g = int(g) + (not g.is_integer())

Trueऔर अजगर में संख्याओं को शामिल करने वाले एक बयान के Falseरूप में 1और व्याख्या की जाती है 0g.is_interger()मूल रूप से अनुवाद करता है g.has_no_decimal()या g == int(g)। इसलिए अंग्रेजी में अंतिम विवरण पढ़ता है round g down and add one if g has decimal


1
और यदि आप कल्पना करते हैं, तो आप int(g) + (g % 1 > 0)इसके बजाय ;-)
नीरो

from math import ceilसंपूर्ण गणित मॉड्यूल आयात करना ठीक लगता है :)
SH7890

@ SH7890 मुझे डर है कि import mathपर्दे के पीछे जो कुछ होता है उसके संदर्भ में यह पंक्ति बहुत अलग नहीं है । यह सिर्फ सभी प्रतीकों को छोड़कर ceil
नीरो

5

गणित का आयात किए बिना // मूल पर्यावरण का उपयोग करके:

a) विधि / वर्ग विधि

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)

5

उन लोगों के लिए जो 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

3

यदि कोई व्यक्ति किसी विशिष्ट दशमलव स्थान पर चक्कर लगाना चाहता है:

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier

1

मुझे आश्चर्य है कि मैंने यह जवाब अभी तक नहीं देखा है 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)))

यह क्यों काम करता है

डॉक्स से

अंतर्निहित प्रकारों के लिए समर्थन दौर () में, मानों को शक्ति माइनस n के 10 के निकटतम कई पर गोल किया जाता है; यदि दो गुणक समान रूप से पास हैं, तो गोलाई भी पसंद के अनुसार की जाती है

इसलिए 2.5 2 से गोल हो जाता है और 3.5 से 4 हो जाता है। अगर ऐसा नहीं होता तो 0.5 को जोड़कर राउंड अप किया जा सकता था, लेकिन हम आधे रास्ते तक पहुंचने से बचना चाहते हैं। इसलिए, यदि आप 0.4999 जोड़ते हैं, तो आप करीब पहुंच जाएंगे, लेकिन सामान्य रूप से आप जो अपेक्षा करेंगे, उसके लिए पर्याप्त मार्जिन के साथ। बेशक, यह विफल हो जाएगा अगर x + 0.4999बराबर है [n].5000, लेकिन यह संभावना नहीं है।


2
0.4999 का उपयोग करते हुए, यह किसी भी इनपुट के लिए ???। 0000 और ???। 0001 (ओपन इंटरवल) के बीच में सही परिणाम देने में विफल होगा, न कि बिल्कुल ???। 0001। उदाहरण के लिए, यदि आप इसे 3.00005 के साथ आज़माते हैं, तो आपको अपेक्षित के बजाय 3 का परिणाम मिलेगा। बेशक, आप अधिक से अधिक अंकों को तैरने की अधिकतम क्षमता तक जोड़कर ऐसा होने की संभावना को कम कर सकते हैं, लेकिन क्या है उस ओर इंगित करें यदि उपयोग करने की तरह हाथ में अधिक मजबूत और सहज समाधान हैं math.ceil()?
ब्लबरडाइब्लूब

@blubberdiblub मेरे उत्तर में मैं बताता हूं Without importing I use:। मैंने यह भी उल्लेख किया है कि अगर x + 0.4999यह बराबर है तो यह विफल हो जाएगा [n].5000
क्लेक

4
हां, आप अपने जवाब में कहते हैं कि आपका समाधान आयात किए बिना है, लेकिन मुझे इसका मूल्य नहीं दिखता है। mathमॉड्यूल और math.ceil(), इसलिए उपलब्ध हर जगह अतिरिक्त सामान की स्थापना के बिना सभी व्यावहारिक उद्देश्यों के लिए मानक पुस्तकालय में है। और आपके असफल होने के उल्लेख के बारे में, यह आपके उत्तर में अधूरा है, क्योंकि यह केवल एक बिंदु के लिए नहीं, बल्कि पूरे अंतराल के लिए विफल रहता है। तकनीकी तौर पर, आप बहस कर सकते आप सही हैं, जैसा कि आप कहते हैं कि अगर और नहीं iff , लेकिन यह आकस्मिक पाठक पर छाप कर देगा कि यह कम संभावना से भी यह वास्तव में है।
5

0

बिना किसी आयात के इसे करने के लिए:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3

0

मुझे पता है कि यह काफी पहले से है, लेकिन मुझे काफी दिलचस्प जवाब मिला, इसलिए यहां जाता है:

-round(-x-0.5)

यह किनारों के मामलों को ठीक करता है और सकारात्मक और नकारात्मक दोनों संख्याओं के लिए काम करता है, और किसी भी फ़ंक्शन आयात की आवश्यकता नहीं होती है

चियर्स


2
यह अभी भी नीचे गोल होगा-round(-x-0.3) = x
Diblo Dk

0

जब आप अजगर में 4500/1000 का संचालन करते हैं, तो परिणाम 4 होगा, क्योंकि परिणाम के रूप में पूर्ण रूप से डिफ़ॉल्ट अजगर asume के लिए, तार्किक रूप से: 4500/1000 = 4.5 -> int (4.5) = 4 और 4 के छत स्पष्ट रूप से 4 है

4500 / 1000.0 का उपयोग करने का परिणाम 4.5 होगा और 4.5 -> 5 का छत होगा

जावास्क्रिप्ट का उपयोग करते हुए आप 4500/1000 के परिणाम के रूप में 4.5 प्राप्त करेंगे, क्योंकि जावास्क्रिप्ट केवल "संख्यात्मक प्रकार" के रूप में परिणाम मानते हैं और परिणाम को सीधे फ्लोट के रूप में लौटाते हैं

शुभ लाभ!!


यह केवल पायथन 2.x में सच है। पायथन 3 में, एक एकल के साथ विभाजन /हमेशा एक फ्लोट में परिणाम करता है, इसलिए 4500/1000हमेशा 4.5 होता है।
निहारो

0

यदि आप कुछ भी आयात नहीं करना चाहते हैं, तो आप हमेशा अपना स्वयं का सरल कार्य लिख सकते हैं:

def RoundUP(num): if num== int(num): return num return int(num + 1)


2
यह काम नहीं करता है यदि संख्या 2.05 है। आपको अपने इनपुट के रूप में 9 के साथ कम से कम कई अंक होने चाहिए, जो आपको 0.999 के साथ छोड़ देगा ... जो कि 1. है, लेकिन फिर आपका कॉर्नर केस 2 फिर से गोल हो जाता है। - अच्छा, मुझे लगता है कि गणित के कारण एक कारण है।
जोहान्स मारिया फ्रैंक

-1

आप फर्श डिविज़न का उपयोग कर सकते हैं और इसमें 1 जोड़ सकते हैं। २.३ // २ + १


2
या ceil()इसके विपरीत अजीब तरह से करने के बजाय उपयोग करें और फिर क्षतिपूर्ति करें
guival

2
यह काम नहीं करेगा। उदाहरण के लिए:from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
कार्ल थॉमे जूल

-1

मुझे लगता है कि आप काम कर रहे तंत्र के बीच int()और भ्रमित कर रहे हैं round()

int()यदि हमेशा फ़्लोटिंग नंबर दिया जाता है, तो हमेशा दशमलव संख्याओं को काटता है; जबकि round(), 2.5जहां के मामले में 2और जहां 3से दोनों समान दूरी पर हैं 2.5, पायथन जो भी 0 बिंदु से अधिक दूर है, लौटाता है।

round(2.5) = 3
int(2.5) = 2

"राउंडिंग अप" का अर्थ है कि उदा। में 2.3बदल जाता है 3, जो आपके किसी भी उदाहरण में नहीं होता है।
नीरो

-2

मेरे हिस्से

मैंने print(-(-101 // 5)) = 21ऊपर दिए गए उदाहरण का परीक्षण किया है।

अब गोलाई के लिए:

101 * 19% = 19.19

मैं उपयोग नहीं कर सकता, **इसलिए मैंने विभाजन को कई गुना फैला दिया:

(-(-101 //(1/0.19))) = 20

-3

मैं मूल रूप से पायथन में एक शुरुआत कर रहा हूं, लेकिन अगर आप नीचे की बजाय गोल करने की कोशिश कर रहे हैं तो ऐसा क्यों न करें:

round(integer) + 1

2
यह किसी भी पूर्णांक i के लिए काम नहीं करेगा जहाँ 2.5 <पूर्णांक <3. चक्कर लगाने के बाद वांछित मान 3 है, लेकिन आपकी अभिव्यक्ति इसे 4 में बदल देगी
प्रणव शुक्ला

1
मुझे लगता round(integer + 0.5)है कि मेरा मतलब है कि यह वही है जो मैं अक्सर करता हूं
क्लीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.