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。