我有一个初学者问题。我怎样才能四舍五入到小数点后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,但即便如此,由于浮点数的工作方式,在某些情况下您可能会感到惊讶。