在Python中四舍五入到小数点后2位



我有一个初学者问题。我怎样才能四舍五入到小数点后2位?以下是我所尝试的和我想要实现的:

import math
var_1 = 14.063  # expected = 14.06
var_2 = 10.625  # expected = 10.63
print(round(14.063, 2))
print(round(10.625, 2))

print('===========================')

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

print(round_up(var_1, 2))
print(round_up(var_2, 2))

输出为:

14.06 
10.62  
===========================
14.07
10.63

所以这两本书都不适合我…

Decimal类、quantize((方法和来自Decimal模块的ROUND_HALF_UP规则可以处理此问题:

from decimal import Decimal, ROUND_HALF_UP
var_1 = 14.063  # expected = 14.06
var_2 = 10.625  # expected = 10.63
# a Decimal object with an explicit exponent attribute/property (to be interpreted by quantize)
Two_places = Decimal("1e-2")
for var in [var_1, var_2]:
rounded = Decimal(var).quantize(Two_places, rounding=ROUND_HALF_UP)
print(f"decimal: {rounded}")
print(f"float:   {float(rounded)}")

我得到:

decimal: 14.06
float:   14.06
decimal: 10.63
float:   10.63

请记住,当你处理浮动时,你总是在操纵一个不太精确的表示,你可能(自然(会想到什么:

Decimal(1.65)    # Decimal('1.649999999999999911182158029987476766109466552734375')
Decimal('1.65')  # Decimal('1.65')

在第一种情况下,1.65首先被转换为IEEE-754浮点,其精度误差从10进制到2进制,然后传递给Decimal。在第二种情况下,Decimal将数字解释为"0";一个和65;这相当于";165乘以10升高到负2〃;,或165e-2。

试试这个。这会找到最近的一个,如果不是,则四舍五入-

import math
v1 = 14.063
v2 = 10.625
def round_up(n, decimals=0):
multiplier = 10 ** decimals
var_down = round(n, 2)
var_up = math.ceil(n * multiplier) / multiplier
if n - var_down >= var_up - n:
return var_up
else:
return var_down
v1_round = round_up(v1, 2)
v2_round = round_up(v2, 2)
print (v1_round) # 14.06
print (v2_round) # 10.63

这应该有效,尽管可能有更有效的方法。我只是拿了你的代码,确定哪一个更接近,以及它们是否相同
编辑:看来PCM制作了这样的版本。

import math
decimals = 2
var_1 = 14.063
var_2 = 10.625
var_1down = round(var_1, decimals)
var_2down = round(var_2, decimals)
def round_up(n, decimals=0):
multiplier = 10 ** decimals
return math.ceil(n * multiplier) / multiplier
var_1up = round_up(var_1, decimals)
var_2up = round_up(var_2, decimals)
if var_1 - var_1down >= var_1up - var_1:
var_1round = var_1up
else:
var_1round = var_1down
if var_2 - var_2down >= var_2up - var_2:
var_2round = var_2up
else:
var_2round = var_2down
print (var_1round)
print (var_2round)

如果你检查文档,你会看到"值四舍五入到10的最接近的倍数减去ndigits;如果两个倍数相等,则向偶数选择进行舍入(例如,舍入(0.5(和舍入(-0.5(均为0,舍入(1.5(为2(";。

因此10.625轮对10.62轮。您可以尝试添加一个非常小的值,例如0.00001,但即便如此,由于浮点数的工作方式,在某些情况下您可能会感到惊讶。