你怎么舍入一个数字?

如何在Python中舍入一个数字?

我尝试了round(number),但它将数字四舍五入。示例:

round(2.3) = 2.0

而不是3,如我所愿。

我尝试了int(number + .5),但它再次将数字四舍五入!示例:

int(2.3 + .5) = 2
1308206 次浏览

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

对于Python 3:

import math
print(math.ceil(4.2))

对于Python 2:

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

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

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

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

问题是在python中划分两个整数会产生另一个整数,并且在天花板调用之前被截断。你必须将一个值设为浮点数(或强制转换)才能获得正确的结果。

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

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

你可能也喜欢numpy:

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

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

不管怎样,只是我遇到的一个细节。我经常使用numpy,很惊讶它没有被提及,但当然接受的答案非常好。

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

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

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

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

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

be shure舍入值应该是浮点数

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

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

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

-round(-x-0.5)

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

干杯

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

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

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

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

rounded_up = -(-numerator // denominator)

例如:

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

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

round(integer) + 1

您可以使用地板偏差并添加1。 2.3//2+1

我很惊讶我还没有看到这个答案round(x + 0.4999),所以我要把它放下。请注意,这适用于任何Python版本。对Python舍入方案所做的更改使事情变得困难。看到这个帖子

没有导入,我使用:

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,这将失败,但这不太可能。

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

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

我很惊讶没有人建议

(numerator + denominator - 1) // denominator

用于整数除法和向上舍入。曾经是C/C++ /CUDA的常用方法(参见divup

当你在python中操作4500/1000时,结果将是4,因为默认的python asume为整数,逻辑上: 4500/1000=4.5-->int(4.5)=4 而4的核心显然是4

使用4500/1000.0,结果将是4.5,cail为4.5-->5

使用javascript,你会得到4.5作为4500/1000的结果,因为javascript只将结果作为“数字类型”并直接将结果作为浮点数返回

祝你好运!!

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

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

TrueFalse在python中涉及数字的语句中被解释为10g.is_interger()基本上翻译为g.has_no_decimal()g == int(g)。所以最后一个英文语句是round g down and add one if g has decimal

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

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)

试试这个:

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

我认为你混淆了int()round()之间的工作机制。

如果给出浮点数,int()总是截断十进制数;而round(),在2.5的情况下,23都在与2.5相等的距离内,Python返回离0点更远的那个。

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

对于那些想要舍入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必须是非负整数

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

此功能不需要模块。

我的那份

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

现在四舍五入:

101 * 19% = 19.19

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

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

如果有人想四舍五入到一个特定的小数位:

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

你可以像这样使用圆:

cost_per_person = round(150 / 2, 2)


  

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

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

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

您必须首先评估该数字是否等于其整数,该整数总是向下舍入。如果结果为True,则返回数字,如果不是,则返回整数(数字)+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如果数字!=round_down
  • x==0如果数字==round_down

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

PS:我详细解释了这一点,因为上面的一些评论要求这样做,我还是新手,所以我不能发表评论。

x * -1 // 1 * -1

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

不需要导入模块。

下面是使用modulobool的方法

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

输出:

3