将数字舍入到最接近的整数

将数字舍入到最接近的整数,第1张

将数字舍入到最接近的整数

int(round(x))

将其舍入并将其更改为整数

编辑:

您没有将int(round(h))分配给任何变量。当您调用int(round(h))时,它返回整数,但不执行其他任何 *** 作。您必须将该行更改为:

h = int(round(h))

将新值分配给h

编辑2:

就像@plowman在评论中说的那样,Python

round()
无法正常运行,这是因为数字作为变量存储的方式通常不是您在屏幕上看到的方式。有很多答案可以解释此行为:

round()似乎无法正确舍入

避免此问题的一种方法是使用此答案所述的十进制:

如果使用小数模块,则无需使用“舍入”功能就可以近似。这是我用于舍入的内容,尤其是在编写货币应用程序时:

Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)

这将返回一个十进制数为16.20。

为了使此答案在不使用额外库的情况下正常运行,使用自定义舍入函数会很方便。经过大量的更正之后,我想出了以下解决方案,据我测试避免了所有存储问题。它基于使用

repr()
(NOT
str()
!)获得的字符串表示形式。看起来很黑,但这是我发现解决所有问题的唯一方法。它可与Python2和Python3一起使用。

def proper_round(num, dec=0):    num = str(num)[:str(num).index('.')+dec+2]    if num[-1]>='5':        return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))    return float(num[:-1])

测试:

>>> print(proper_round(1.0005,3))1.001>>> print(proper_round(2.0005,3))2.001>>> print(proper_round(3.0005,3))3.001>>> print(proper_round(4.0005,3))4.001>>> print(proper_round(5.0005,3))5.001>>> print(proper_round(1.005,2))1.01>>> print(proper_round(2.005,2))2.01>>> print(proper_round(3.005,2))3.01>>> print(proper_round(4.005,2))4.01>>> print(proper_round(5.005,2))5.01>>> print(proper_round(1.05,1))1.1>>> print(proper_round(2.05,1))2.1>>> print(proper_round(3.05,1))3.1>>> print(proper_round(4.05,1))4.1>>> print(proper_round(5.05,1))5.1>>> print(proper_round(1.5))2.0>>> print(proper_round(2.5))3.0>>> print(proper_round(3.5))4.0>>> print(proper_round(4.5))5.0>>> print(proper_round(5.5))6.0>>> >>> print(proper_round(1.000499999999,3))1.0>>> print(proper_round(2.000499999999,3))2.0>>> print(proper_round(3.000499999999,3))3.0>>> print(proper_round(4.000499999999,3))4.0>>> print(proper_round(5.000499999999,3))5.0>>> print(proper_round(1.00499999999,2))1.0>>> print(proper_round(2.00499999999,2))2.0>>> print(proper_round(3.00499999999,2))3.0>>> print(proper_round(4.00499999999,2))4.0>>> print(proper_round(5.00499999999,2))5.0>>> print(proper_round(1.0499999999,1))1.0>>> print(proper_round(2.0499999999,1))2.0>>> print(proper_round(3.0499999999,1))3.0>>> print(proper_round(4.0499999999,1))4.0>>> print(proper_round(5.0499999999,1))5.0>>> print(proper_round(1.499999999))1.0>>> print(proper_round(2.499999999))2.0>>> print(proper_round(3.499999999))3.0>>> print(proper_round(4.499999999))4.0>>> print(proper_round(5.499999999))5.0

最后,正确的答案将是:

# Having proper_round defined as previously statedh = int(proper_round(h))

编辑3:

测试:

>>> proper_round(6.39764125, 2)6.31 # should be 6.4>>> proper_round(6.9764125, 1)6.1  # should be 7

此处的陷阱是,

dec
第-小数位可以为9,如果
dec+1
-th数> = 5,则9将变为0,并且应将1携带到
dec-1
第-位。

如果考虑到这一点,我们将得到:

def proper_round(num, dec=0):    num = str(num)[:str(num).index('.')+dec+2]    if num[-1]>='5':      a = num[:-2-(not dec)]       # integer part      b = int(num[-2-(not dec)])+1 # decimal part      return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))    return float(num[:-1])

在上述情况下

b = 10
,以前的版本将串联在一起
a
b
这将导致
10
尾随0消失的位置的串联。此版本
b
会根据正确地转换为右小数位
dec



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5643585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存