假设我有
8.8333333333333339
,我想将其转换为8.84
。我怎样才能在Python中完成这个?
round(8.8333333333333339, 2)
给出 8.83
而不是 8.84
。我是 Python 或一般编程新手。
我不想将其打印为字符串,结果将被进一步使用。有关该问题的更多信息,请查看 Tim Wilson 的 Python 编程技巧:贷款和付款计算器。
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 位小数,该数字首先乘以 102
(或 100)移动小数点,然后除以它进行补偿。 如果您出于某种原因不想使用
math
模块,您可以使用我刚刚编写的这个(经过最低限度测试的)实现:
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
这一切与链接的
四舍五入了每月付款,这就是许多人所说的上限函数的效果。这意味着每个月支付的金额略多于总金额的 1⁄12。这使得最终付款比平时要少一些——剩下的未付余额只有 8.76
。
8.83
和稍高的最终付款
8.87
也同样有效。然而,在现实世界中,人们通常不喜欢付款增加,因此对每笔付款进行四舍五入是常见的做法 - 它还可以更快地将钱返还给贷方。(与Python无关),因为8.83不能精确地表示为二进制浮点,就像1/3不能精确地表示为十进制(0.333333...无穷无尽)。 如果要保证绝对精度,需要
模块:
>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
>>> 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')
>>>
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() 函数通过接受两个参数来工作。第一个是您要舍入的数字。第二个是要四舍五入的小数位数。
format()
例如:
format(1.242563,".2f")
输出将是:
1.24
同样:
format(9.165654,".1f")
会给出:
9.2
print "%.2f" % 8.833333333339 #(Replace number with the variable?)
"%.2f" % (math.ceil(x * 100) / 100)
def roundno(no):
return int(no//1 + ((no%1)/0.5)//1)
在那里,不需要包含/导入
< .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
tax = (tax / 100) * price
然后是这段代码:
tax = round((tax / 100) * price, 2)
圆形对我有用
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(最多两位小数)