你如何四舍五入一个数字?

How do you round UP a number?

提问人:bodacydo 提问时间:3/1/2010 最后编辑:Communitybodacydo 更新时间:4/29/2023 访问量:1496395

问:

如何在 Python 中将数字向上四舍五入?

我试过了,但它把数字四舍五入了。下面是一个示例:round(number)

round(2.3) = 2.0 

而不是我想要的 3。

然后我试了一下,但它又把数字四舍五入了!例:int(number + .5)

int(2.3 + .5) = 2
Python 浮点整 舍入

评论

13赞 Nearoo 1/28/2019
round(number + .5)如果数字为整数,则不起作用。,当你真正想要的时候.round(3+.5) == 43

答:

1278赞 Steve Tjoa 3/1/2010 #1

math.ceil(天花板)函数返回大于或等于的最小整数。x

对于 Python 3:

import math
print(math.ceil(4.2))

对于 Python 2:

import math
print(int(math.ceil(4.2)))

评论

44赞 R. W. Sinnet 8/27/2015
详细说明:math.ceil 返回大于或等于输入值的最小整数。此函数将输入视为浮点数(Python 没有强类型变量),并且该函数返回浮点数。如果你想要一个 int,你可以从返回值构造一个 int,即int(math.ceil(363))
14赞 Bernhard 1/8/2016
@Sinnet:实际上可以说python是强类型的 stackoverflow.com/a/11328980/5069869
3赞 quamrana 12/17/2017
@TheEspinosa:是的,python 绝对是类型的,只是许多函数会询问有关某些参数类型的问题,并根据答案执行不同的代码。
30赞 Arthur Tacca 5/2/2018
@R.W.Sinnet 在 Python 3 中,返回一个实际的整数对象,而不仅仅是具有整数值的浮动对象。math.ceil
6赞 ofthestreet 9/10/2019
注意浮子精度,由于ceil可以增加很多10000000 * 0.00136 = 13600.000000000002math.ceil(10000000 * 0.00136) = 13601.0
40赞 kennytm 3/1/2010 #2

使用 math.ceil 向上舍入:

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

注意:输入应为浮点数。

如果需要整数,请调用进行转换:int

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

顺便说一句,用于向下舍入和舍入到最接近的整数。math.floorround

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

评论

2赞 gdvalderrama 2/24/2017
如果使用 python 3,输入不一定需要是浮点数: 将在内部处理它ceil()
0赞 hummusw 6/14/2021
请注意,在 python 3 中,实际上会像文档中所述四舍五入到偶数,因此第二行将返回round()(4, 4, 5, 6)
178赞 TrophyGeek 10/31/2011 #3

要记住的有趣的 Python 2.x 问题:

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

问题是在 python 中除以两个 int 会产生另一个 int,并且在上限调用之前被截断。您必须将一个值设为浮点数(或强制转换)才能获得正确的结果。

在 javascript 中,完全相同的代码会产生不同的结果:

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

评论

49赞 gecco 10/31/2011
在 Python 2.x 中:int/int --> int int/float --> float 在 Python 3.x:int/int 可以导致浮点数
8赞 Rob Dennis 10/23/2013
您可以通过启用“true division”来获取某些版本的 Python 2.x 上的 Python 3.x 行为,如下所示
86赞 Lisa 4/27/2013 #4

您可能也喜欢numpy:

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

我并不是说它比数学更好,但如果你已经将numpy用于其他目的,你可以保持你的代码一致。

无论如何,只是我遇到的一个细节。我经常使用 numpy,很惊讶它没有被提及,但当然公认的答案效果很好。

评论

5赞 Marco smdm 4/4/2017
使用 numpy 也很好。最简单的是数学,因为它已经是 python 内置库的一部分。这更有意义。相反,正如您提到的,如果您使用大量numpy来解决其他问题,那么使用numpy.ceil是有意义且一致的:-)好提示!
0赞 ProfessorPorcupine 12/11/2021
如果你使用的是 pandas 并将整个模块导入为 pd,那么只需使用 pd.np.ceil(2.3)。无需单独的 numpy 导入。
321赞 user3074620 5/11/2014 #5

我知道这个答案是针对不久前的一个问题,但如果你不想导入数学,而只是想四舍五入,这对我有用。

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

第一部分变为 4,如果有余数,则第二部分的计算结果为“True”,此外 True = 1;False = 0。因此,如果没有余数,则保持相同的整数,但如果有余数,则加 1。

评论

87赞 naught101 8/19/2015
好。您也可以用于整数除法,因此这变为 .//21 // 5 + (21 % 5 > 0)
4赞 Bitstream 10/13/2021
...并将其作为一个很好的函数: def round_up(number): return int(number) + (number % 1 > 0)
0赞 france1 1/12/2023
但是你必须为此做很多计算,对吧?我知道,你不在乎,我也不在乎,除非我真的在乎。
0赞 VMAtm 8/1/2023
此外,集成功能也可用于此目的:divmodd, m = divmod(number) return int(d) + m > 0
0赞 Andrey Antipov 6/15/2014 #6

要在没有任何导入的情况下执行此操作,请执行以下操作:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3
7赞 Alexey 7/31/2014 #7

be shure 舍入值应为 float

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

print math.ceil(float(a) / b)
>>> 1.0
0赞 Fenmaz 1/14/2015 #8

我知道这是很久以前的事了,但我找到了一个非常有趣的答案,所以这里是:

-round(-x-0.5)

这修复了边缘情况,适用于正数和负数,并且不需要任何函数导入

干杯

评论

2赞 Diblo Dk 6/20/2015
这仍将四舍五入-round(-x-0.3) = x
0赞 Jonah 9/18/2021
还会错误地递增确切的数字。例如,应该返回 4 而不是 3。-round(-3-0.5)
13赞 NuclearPeon 3/28/2015 #9

语法可能不像人们喜欢的那样 pythonic,但它是一个强大的库。

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

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
197赞 David Bau 2/1/2016 #10

如果使用整数,四舍五入的一种方法是利用四舍五入的事实:只需对负数进行除法,然后否定答案。无需导入、浮点或条件。//

rounded_up = -(-numerator // denominator)

例如:

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

评论

2赞 Klik 9/8/2016
当你不需要执行任何数学运算时呢?也就是说,你只有一个数字。
5赞 Marco smdm 4/4/2017
@Klik:那么你可以除以 1 ==> -( -num // 1) 你就会得到你的答案 :-)有好的一天!David Bau:非常好的提议!
2赞 ShadowRanger 8/8/2019
好!我一直使用 ,这对于具有正分母的输入很好,但如果涉及单个非积分(分子或分母),则失败;这看起来更神奇,但对 S 和 S 都有效。对于小分子,它也更快(在 CPython 3.7.2 上),但奇怪的是,当只有分子足够大以至于需要基于数组的数学运算时,您的方法会更慢;不清楚为什么会这样,因为除法工作应该是相似的,两个一元否定应该比加法+减法便宜。(num + den - 1) // denintfloatintfloat
2赞 Ehsan Fathi 4/14/2020
事实上,它不需要任何导入,而且速度很快,这正是我想要的。
-4赞 Daniel 6/1/2016 #11

我基本上是 Python 的初学者,但如果你只是想向上而不是向下舍入,为什么不这样做:

round(integer) + 1

评论

2赞 Pranav Shukla 6/1/2016
这不适用于任何整数 i,其中 2.5 <整数< 3。四舍五入后所需的值为 3,但您的表达式会将其转换为 4。
1赞 Klik 9/8/2016
我想你的意思是我经常做的事情round(integer + 0.5)
-1赞 user6612280 7/20/2016 #12

您可以使用地板设计并向其添加 1。 2.3 // 2 + 1

评论

2赞 gdvalderrama 2/24/2017
或者使用而不是奇怪地做相反的事情,然后进行补偿ceil()
2赞 Carl Thomé 7/26/2017
这是行不通的。例如:from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
0赞 Klik 9/8/2016 #13

我很惊讶我还没有看到这个答案,所以我要把它放下。请注意,这适用于任何 Python 版本。对 Python 舍入方案所做的更改使事情变得困难。请参阅此帖子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)))

为什么这样做

从文档

对于支持 round() 的内置类型,值四舍五入到最接近 10 的幂减去 n 的倍数;如果两个倍数相等接近,则向偶数选择进行舍入

因此,2.5 四舍五入为 2,3.5 四舍五入为 4。如果不是这种情况,那么可以通过添加 0.5 来完成四舍五入,但我们希望避免到达中途点。因此,如果您添加 0.4999,您将接近,但有足够的余量四舍五入到您通常预期的值。当然,如果 等于 ,这将失败,但这不太可能。x + 0.4999[n].5000

评论

3赞 blubberdiblub 11/14/2016
使用 0.4999,它将无法为???.之间的任何输入提供正确的结果0000 和 ???.0001(开路间隔),而不仅仅是???.0001. 例如,如果您尝试使用 3.00005,您将得到 3 的结果,而不是预期的 4。当然,您可以通过添加越来越多的数字来降低发生这种情况的可能性,直到浮点数的最大精度,但是如果手头有更强大、更直观的解决方案,比如使用 ?math.ceil()
0赞 Klik 11/15/2016
@blubberdiblub 在我的回答中,我说.我还提到过,如果 等于 .Without importing I use:x + 0.4999[n].5000
4赞 blubberdiblub 11/17/2016
是的,您在回答中声明您的解决方案无需导入,但我看不出它的价值。该模块位于标准库中,因此随处可用,无需安装额外的内容即可用于所有实际目的。关于你提到的失败时间,这在你的回答中是不完整的,因为它在整个时间间隔内失败,而不仅仅是一个点。从技术上讲,你可以争辩说你是正确的,正如你所说的那样,if和not iff,但这会给普通读者留下这样的印象,即它比实际情况更不可能。mathmath.ceil()
1赞 Sebin 3/19/2017 #14

如果你不想导入任何东西,你可以随时编写自己的简单函数,如下所示:

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

评论

4赞 Johannes Maria Frank 3/28/2017
如果 num 为 2.05,则此操作不起作用。您必须至少有与输入一样多的 9 数字,剩下 0.999...即 1。但随后你的极端情况 2 又被四舍五入了。-- 嗯,我想math.ceil的存在是有原因的。
28赞 Andreas Schuh 4/8/2017 #15

我很惊讶没有人建议

(numerator + denominator - 1) // denominator

用于四舍五入的整数除法。曾经是 C/C++/CUDA 的常用方式(参见。divup)

评论

4赞 Bharel 7/6/2017
仅与静态类型语言相关。如果分母是浮点数,你就死了。
2赞 ShadowRanger 8/8/2019
这也只有在分母为正时才有效;如果分母为负数,则需要加法而不是减法,或者在进行数学运算之前将分子和分母的符号都翻转过来。1
3赞 Nolan 1/23/2021
@Bharel显然不是真的。Python 有类型,您甚至可以检查它的值。此代码适用于 int。同样值得注意的是,此代码甚至适用于大于 2^53 的整数,在这种情况下,浮点运算可能无法产生正确的结果。
-1赞 erick vicente 4/28/2017 #16

当您在 Python 中操作 4500/1000 时,结果将为 4,因为对于默认的 Python 来说,从逻辑上讲,结果假定为整数: 4500/1000 = 4.5 --> 整数(4.5) = 4 而 4 的 ceil 显然是 4

使用 4500/1000.0,结果为 4.5,CEIL 为 4.5 --> 5

使用 javascript,您将收到 4.5 作为 4500/1000 的结果,因为 javascript 仅将结果假定为“数值类型”,并直接以浮点数形式返回结果

祝你好运!!

评论

1赞 Nearoo 6/19/2018
这仅在 Python 2.x 中是正确的。在 Python 3 中,用 single 除法总是会产生浮点数,所以总是 4.5。/4500/1000
7赞 Nearoo 5/5/2017 #17

上面的答案是正确的,但是,仅为这一个函数导入模块对我来说通常感觉有点矫枉过正。幸运的是,还有另一种方法可以做到这一点:math

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

True并在 Python 中解释为涉及数字的语句中的 和。 基本上翻译为 或 .所以英文的最后一句话是.False10g.is_interger()g.has_no_decimal()g == int(g)round g down and add one if g has decimal

评论

2赞 Nearoo 5/5/2017
如果你觉得花哨,你可以改用;-)int(g) + (g % 1 > 0)
0赞 SH7890 1/26/2019
from math import ceil似乎修复了导入整个数学模块的问题:)
1赞 Nearoo 1/28/2019
@SH7890恐怕这条线与幕后发生的事情没有太大区别。它只是删除除 .import mathceil
6赞 Kuřátko Zvyk 11/19/2017 #18

无需导入数学 // 使用基本环境:

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)

b) lambda:

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
11赞 user3712978 12/5/2017 #19

试试这个:

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

评论

2赞 Tom Aranda 12/5/2017
聪明。每当需要四舍五入时,表达式都会返回。您可能想扩展您的答案并解释其工作原理。((int(a) - a) != 0)1a
0赞 Bowen Liu 12/19/2018
@TomAranda 谁能解释一下布尔表达式是如何计算为值的?
-3赞 SooBin Kim 3/15/2018 #20

我认为您混淆了 和 之间的工作机制.int()round()

int()如果给出浮点数,则始终截断十进制数;而 ,如果 where 和 都在相等的距离内,Python 返回离 0 点较远的那个。round()2.5232.5

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

评论

0赞 Nearoo 6/19/2018
“四舍五入”是指例如 变成 ,这在您的两个示例中都没有发生。2.33
14赞 Pavel 3/17/2018 #21

对于那些想要四舍五入并得到整数的人: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

注意:ab 必须是非负整数

评论

0赞 wlad 8/25/2021
给出了错误的答案。应该是当它int_ceil(-0.1, 1)0.0-1.0
0赞 Pavel 8/25/2021
@ogogmad只有当 a 和 b 是整数时才有意义。如果您有浮点数,请使用 math.ceil 作为顶部答案的建议
0赞 wlad 8/26/2021
int_ceil(2,-1)给我。所以整数必须是非负数0
0赞 Pavel 8/26/2021
@ogogmad我同意,在答案中添加了注释,谢谢
0赞 user313032 12/7/2021
@Pavel b是正的还不够吗?
5赞 PonasM 6/21/2018 #22
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

此功能不需要任何模块。

评论

7赞 buydadip 10/21/2018
如果你的号码是 ,那么它会四舍五入到可能是也可能不是某人想要的34
-3赞 andres 11/21/2018 #23

我的份额

我已经测试了上面给出的例子。print(-(-101 // 5)) = 21

现在四舍五入:

101 * 19% = 19.19

我不能使用,所以我将乘法传播到除法:**

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

评论

1赞 python-coder12345 7/15/2021
请解释一下你想做什么?
9赞 osuwireless 2/9/2020 #24

如果有人希望四舍五入到特定的小数位:

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
0赞 Thiago 12/27/2020 #25

你可以像这样使用 round:

cost_per_person = round(150 / 2, 2)

  

评论

0赞 Richard Valenz 12/7/2021
当 round() 的第二个参数为零时,这应该有效。即为圆形(x/y,0)
2赞 BESS 1/11/2021 #26

对于那些不想使用导入的人。

对于给定列表或任何数字:

x = [2, 2.1, 2.5, 3, 3.1, 3.5, 2.499,2.4999999999, 3.4999999,3.99999999999]

您必须首先评估该数字是否等于其整数,该整数始终向下舍入。如果结果为 True,则返回数字,如果不是,则返回 integer(number) + 1。

w = lambda x: x if x == int(x) else int(x)+1
[w(i) for i in z]
>>> [2, 3, 3, 3, 4, 4, 3, 3, 4, 4]

数学逻辑:

  • 如果数字有小数部分:round_up - round_down == 1,则始终。
  • 如果数字没有小数部分:round_up - round_down == 0。

所以:

  • round_up == x + round_down

跟:

  • x == 1 if number != round_down
  • x == 0 如果数字 == round_down

您将数字切成两部分,整数和小数。如果 decimal 不是 0,则加 1。

PS:我详细解释了这一点,因为上面的一些评论要求这样做,而我在这里仍然是菜鸟,所以我不能发表评论。

6赞 wlad 8/25/2021 #27

x * -1 // 1 * -1

令人困惑,但它有效:对于,你得到.对于 ,你得到x=7.18.0x = -1.1-1.0

无需导入模块。

评论

0赞 Chadee Fouad 2/6/2022
很好,但背后的逻辑是什么?
2赞 Alexander 2/7/2023
x * -1 // 1 * -1 = -(-x // 1).// 运算符总是向下舍入,所以 x // 1 = floor(x)。因此,这里的逻辑是将否定的数字向下舍入,然后再次否定,从而导致原始数字四舍五入。
17赞 rhug123 3/21/2022 #28

这是一种使用 和modulobool

n = 2.3
int(n) + bool(n%1)

输出:

3

评论

3赞 irene 3/30/2022
因不需要导入而投了赞成票
-2赞 Santosh Agrawal 4/1/2023 #29

这应该有效。

a=16
b= int(input("Please enter a number greater than 0 \n"))

if b==0:
    print ( "Wrong input")

elif a%b != 0:
    c=a/b
    d= int(c)+1
    print (c)
    print (d)
else:
    c=a/b
    d=c        
print (c)
print (d)

评论

0赞 Chris 4/6/2023
这个问题已经有 13 年多的历史了,有几十个现有的答案。你完全确定你的答案会带来新的东西吗?如果是这样,那就太好了!但请向我们解释一下。
0赞 Possum Gallo 4/7/2023 #30

这是一个非常简单的答案,基于默认 round() 的使用

def round_up(arg):
    if arg > round(arg):
        return round(arg) + 1
    else:
        return round(arg)

确实如此

1 to 1     -1 to -1     1.0 to 1    1.00000001 to 2    -1.00000001 to -1