Python 四舍五入到小数点后两位
Round up to 2 decimal in Python
我有一个新手问题。我怎样才能四舍五入到小数点后两位?
这是我尝试过的和我想要实现的:
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
所以这些都不适合我...
如果您查看文档,您会看到“值被四舍五入到最接近的 10 的乘方减去 ndigits 的倍数;如果两个倍数同样接近,则四舍五入是为了选择偶数(因此,例如, round(0.5) 和 round(-0.5) 都是 0,round(1.5) 是 2)".
所以 10.625 四舍五入为 10.62。您可以尝试添加一个非常小的值,例如0.00001,但即便如此,由于浮点数的工作方式,在某些情况下您可能会有些意外。
这应该可行,尽管可能有更有效的方法。我刚拿了你的代码,确定了哪个更接近,如果它们相同就四舍五入。
编辑: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)
试试这个。这会找到最近的一个,如果没有,则向上舍入 -
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
Decimal class、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
请记住,当您处理浮点数时,您总是在操纵 less-than-precise 表示您可能(自然地)想到的内容:
Decimal(1.65) # Decimal('1.649999999999999911182158029987476766109466552734375')
Decimal('1.65') # Decimal('1.65')
在第一种情况下,首先将 1.65 转换为 IEEE-754 浮点数,其精度误差从 base-10 变为 base-2,然后传递给 Decimal。在第二种情况下,Decimal 将数字解释为“一和 65 100-ths”,等于“165 乘以 10 的负 2”,或 165e-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
所以这些都不适合我...
如果您查看文档,您会看到“值被四舍五入到最接近的 10 的乘方减去 ndigits 的倍数;如果两个倍数同样接近,则四舍五入是为了选择偶数(因此,例如, round(0.5) 和 round(-0.5) 都是 0,round(1.5) 是 2)".
所以 10.625 四舍五入为 10.62。您可以尝试添加一个非常小的值,例如0.00001,但即便如此,由于浮点数的工作方式,在某些情况下您可能会有些意外。
这应该可行,尽管可能有更有效的方法。我刚拿了你的代码,确定了哪个更接近,如果它们相同就四舍五入。
编辑: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)
试试这个。这会找到最近的一个,如果没有,则向上舍入 -
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
Decimal class、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
请记住,当您处理浮点数时,您总是在操纵 less-than-precise 表示您可能(自然地)想到的内容:
Decimal(1.65) # Decimal('1.649999999999999911182158029987476766109466552734375')
Decimal('1.65') # Decimal('1.65')
在第一种情况下,首先将 1.65 转换为 IEEE-754 浮点数,其精度误差从 base-10 变为 base-2,然后传递给 Decimal。在第二种情况下,Decimal 将数字解释为“一和 65 100-ths”,等于“165 乘以 10 的负 2”,或 165e-2。