如何将浮点数四舍五入到某个小数位? [重复]

问题描述 投票:0回答:12

假设我有

8.8333333333333339
,我想将其转换为
8.84
。我怎样才能在Python中完成这个?

round(8.8333333333333339, 2)
给出
8.83
而不是
8.84
。我是 Python 或一般编程新手。

我不想将其打印为字符串,结果将被进一步使用。有关该问题的更多信息,请查看 Tim Wilson 的 Python 编程技巧:贷款和付款计算器

python floating-point
12个回答
108
投票

8.833333333339
(或
8.833333333333334
106.00/12
的结果)正确四舍五入到小数点后两位是
8.83
。从数学上讲,听起来您想要的是一个“天花板函数”。 Python 的 math 模块中的名为
ceil
:
import math v = 8.8333333333333339 print(math.ceil(v*100)/100) # -> 8.84

下限和上限函数通常分别将实数映射到小数点后 0 位的最大先前或最小后续整数 - 因此要将它们用于 2 位小数,该数字首先乘以 10
2

(或 100)移动小数点,然后除以它进行补偿。 如果您出于某种原因不想使用

math

模块,您可以使用我刚刚编写的这个(经过最低限度测试的)实现:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

这一切与链接的

贷款和付款计算器问题有何关系:

从示例输出来看,他们

四舍五入了每月付款,这就是许多人所说的上限函数的效果。这意味着每个月支付的金额略多于总金额的 112。这使得最终付款比平时要少一些——剩下的未付余额只有 8.76

使用正常舍入产生每月付款 

8.83

和稍高的最终付款

8.87
也同样有效。然而,在现实世界中,人们通常不喜欢付款增加,因此对每笔付款进行四舍五入是常见的做法 - 它还可以更快地将钱返还给贷方。
    


70
投票
这是正常的

(与Python无关),因为8.83不能精确地表示为二进制浮点,就像1/3不能精确地表示为十进制(0.333333...无穷无尽)。 如果要保证绝对精度,需要

decimal

模块:
>>> import decimal >>> a = decimal.Decimal("8.833333333339") >>> print(round(a,2)) 8.83



23
投票

>>> import decimal >>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP) Decimal('8.34') >>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN) Decimal('8.33') >>>



14
投票

total_price = float() price_1 = 2.99 price_2 = 0.99 total_price = price_1 + price_2

如果你现在打印出total_price,你会得到

3.9800000000000004

但是如果你将它包含在像这样的 round() 函数中

print(round(total_price,2))

输出等于

3.98

round() 函数通过接受两个参数来工作。第一个是您要舍入的数字。第二个是要四舍五入的小数位数。


10
投票

format()

例如:

format(1.242563,".2f")

输出将是:

1.24

同样:

format(9.165654,".1f")

会给出:

9.2



7
投票

print "%.2f" % 8.833333333339 #(Replace number with the variable?)



6
投票

"%.2f" % (math.ceil(x * 100) / 100)



5
投票

def roundno(no): return int(no//1 + ((no%1)/0.5)//1)

在那里,不需要包含/导入


2
投票
decimal

模块:

http://docs.python.org/library/decimal.html
ََََََ


2
投票

< .5 round down > = .5 round up


import math def _should_round_down(val: float): if val < 0: return ((val * -1) % 1) < 0.5 return (val % 1) < 0.5 def _round(val: float, ndigits=0): if ndigits > 0: val *= 10 ** (ndigits - 1) is_positive = val > 0 tmp_val = val if not is_positive: tmp_val *= -1 rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val) if not is_positive: rounded_value *= -1 if ndigits > 0: rounded_value /= 10 ** (ndigits - 1) return rounded_value # test # nr = 12.2548 # for digit in range(0, 4): # print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit))) # output # 0 decimals : 12.2548 -> 12 # 1 decimals : 12.2548 -> 12.0 # 2 decimals : 12.2548 -> 12.3 # 3 decimals : 12.2548 -> 12.25


1
投票

tax = (tax / 100) * price

然后是这段代码:

tax = round((tax / 100) * price, 2)

圆形对我有用


0
投票

def precision(num,x): return "{0:.xf}".format(round(num))

这里,num是十进制数。 x 是您想要对浮点数进行四舍五入的小数点。

与其他实现相比的优点是它可以在小数点右端填充零,使十进制数字最多可达 x 个小数位。

示例1:

precision(10.2, 9)

会回来

10.200000000(最多 9 位小数)

示例2:

precision(10.2231, 2)

会回来

10.22(最多两位小数)

© www.soinside.com 2019 - 2024. All rights reserved.