bod*_*ydo 439 python floating-point integer rounding python-2.x
这个问题让我很难过.如何在Python中对数字进行综合?
我尝试了一些(数字),但它将数字向下舍入.例:
round(2.3) = 2.0 and not 3, what I would like
Run Code Online (Sandbox Code Playgroud)
我尝试了int(数字+ .5),但它再次将数字向下舍入!例:
int(2.3 + .5) = 2
Run Code Online (Sandbox Code Playgroud)
然后我尝试了一下(数字+ .5)但它在边缘情况下不起作用.例:
WAIT! THIS WORKED!
Run Code Online (Sandbox Code Playgroud)
请指教.
Ste*_*joa 782
该小区(上限)功能:
import math
print(math.ceil(4.2))
Run Code Online (Sandbox Code Playgroud)
Tro*_*eek 154
有趣的Python 2.x问题要牢记:
>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0
Run Code Online (Sandbox Code Playgroud)
问题是在python中划分两个int会产生另一个int,并且在天花板调用之前会被截断.您必须使一个值成为浮点(或强制转换)以获得正确的结果.
在javascript中,完全相同的代码会产生不同的结果:
console.log(Math.ceil(4500/1000));
5
Run Code Online (Sandbox Code Playgroud)
use*_*620 151
我知道这个答案是针对前一个问题的答案,但是如果你不想导入数学而你只想整理一下,这对我有用.
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
Run Code Online (Sandbox Code Playgroud)
如果有余数,第一部分变为4,第二部分评估为"真",此外True = 1; False = 0.因此,如果没有余数,则它保持相同的整数,但如果有余数则加1.
Dav*_*Bau 94
如果使用整数,一种四舍五入的方法是利用//向下舍入的事实:只对负数进行除法,然后否定答案.不需要导入,浮点或条件.
rounded_up = -(-numerator // denominator)
Run Code Online (Sandbox Code Playgroud)
例如:
>>> print(-(-101 // 5))
21
Run Code Online (Sandbox Code Playgroud)
Lis*_*isa 52
你可能也喜欢numpy:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
Run Code Online (Sandbox Code Playgroud)
我并不是说它比数学更好,但是如果你已经将numpy用于其他目的,那么你可以保持代码的一致性.
无论如何,只是我遇到的一个细节.我经常使用numpy并且很惊讶它没有被提及,但当然接受的答案完全正常.
ken*_*ytm 28
用于math.ceil向上舍入:
>>> import math
>>> math.ceil(5.4)
6.0
Run Code Online (Sandbox Code Playgroud)
注意:输入应该是浮动的.
如果你需要一个整数,请调用int它来转换它:
>>> int(math.ceil(5.4))
6
Run Code Online (Sandbox Code Playgroud)
顺便说一句,用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)
Run Code Online (Sandbox Code Playgroud)
rhu*_*123 18
modulo这是一种使用和的方法bool
n = 2.3
int(n) + bool(n%1)
Run Code Online (Sandbox Code Playgroud)
输出:
3
Run Code Online (Sandbox Code Playgroud)
Nuc*_*eon 12
语法可能不像人们想象的那样pythonic,但它是一个功能强大的库.
https://docs.python.org/2/library/decimal.html
from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
Run Code Online (Sandbox Code Playgroud)
小智 11
我没有人建议我感到惊讶
(numerator + denominator - 1) // denominator
Run Code Online (Sandbox Code Playgroud)
用于舍入的整数除法.曾经是C/C++/CUDA的常用方法(参见divup)
对于那些想要四舍五入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
Run Code Online (Sandbox Code Playgroud)
注意:aandb必须是非负整数
要保持圆润的价值应该浮动
a = 8
b = 21
print math.ceil(a / b)
>>> 0
Run Code Online (Sandbox Code Playgroud)
但
print math.ceil(float(a) / b)
>>> 1.0
Run Code Online (Sandbox Code Playgroud)
小智 6
试试这个:
a = 211.0
print(int(a) + ((int(a) - a) != 0))
Run Code Online (Sandbox Code Playgroud)
>>> def roundup(number):
... return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
Run Code Online (Sandbox Code Playgroud)
此功能不需要模块.
x * -1 // 1 * -1
令人困惑,但它有效:对于x=7.1,你得到8.0。对于x = -1.1,你得到-1.0
无需导入模块。
上面的答案是正确的,但是,math为这个功能导入模块通常对我来说有点过分.幸运的是,还有另一种方法:
g = 7/5
g = int(g) + (not g.is_integer())
Run Code Online (Sandbox Code Playgroud)
True并被False解释为1和0python中涉及数字的语句.g.is_interger()基本上翻译成g.has_no_decimal()或g == int(g).所以最后一个英文说法是round g down and add one if g has decimal.
小智 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)
Run Code Online (Sandbox Code Playgroud)
b)lambda:
ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
Run Code Online (Sandbox Code Playgroud)
如果有人希望四舍五入到特定的小数位:
import math
def round_up(n, decimals=0):
multiplier = 10 ** decimals
return math.ceil(n * multiplier) / multiplier
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
700260 次 |
| 最近记录: |