如何四舍五入浮点数达到一定的小数位?
假设我有8.8333333333333339
,我想把它转换为8.84
,我怎么能在Python中完成这个? round(8.8333333333333339, 2)
给出8.83
而不是8.84
。 我是一般的Python或编程新手。
我不想打印它作为一个string,结果将被进一步使用。 有关该问题的更多信息,请查阅Tim Wilson的Python编程技巧:贷款和付款计算器 。
8.833333333339
(或8.833333333333334
106.00/12
的结果)正确舍入到小数点后两位是8.83
。 math上,它听起来像你想要的是一个天花板function 。 Python中的math
模块名为ceil
:
import math v = 8.8333333333333339 print(math.ceil(v*100)/100) # -> 8.84
分别地,上限和下限函数通常将实数映射到具有小数位数为零的最大的前一个或最小的后面的整数 – 因此,使用它们保留2个小数位,数字首先乘以10 2 (或100)以移动小数然后再由它来除以补偿。
如果你不想使用math
模块出于某种原因,你可以使用我刚刚写的这个(最低限度testing)的实现:
def ceiling(x): n = int(x) return n if n-1 < x <= n else n+1
这如何适用于链接贷款和付款计算器的问题
从样本的输出看来,他们收集了每月的支付,这就是所谓的最高限额function的效果。 这意味着每月有多于总额的1/12被支付。 这使得最后的付款比平时less一点 – 留下余下的8.76
余款。
使用正常的四舍五入方法同样有效,每月支付8.83
,最终支付8.87
。 然而,在现实世界中,人们普遍不喜欢支付他们的费用,所以每次支付都是一个普遍的做法 – 它也会更快地把钱还给贷方。
这是正常的 (与Python无关),因为8.83不能完全表示为二进制浮点数,就像1/3不能完全用十进制表示(0.333333 … ad infinitum)。
如果你想确保绝对精度,你需要decimal
模块:
>>> 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') >>>
如果将8.8333333333339舍入为2位小数,则正确的答案是8.83,而不是8.84。 你得到8.83000000001的原因是因为8.83是一个二进制不能正确表示的数字,它给你最接近的一个。 如果你想打印它没有所有的零,做VGE说:
print "%.2f" % 8.833333333339 #(Replace number with the variable?)
更简单的方法是简单地使用round()函数。 这是一个例子。
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()函数通过接受两个参数来工作。 首先是你想要的数字。 第二个是要舍入的小数位数。
如果你想轮,8.84是不正确的答案。 8.833333333333四舍五入是8.83而不是8.84。 如果你想总是四舍五入,那么你可以使用math.ceil。 做这两个与string格式的组合,因为舍入一个浮点数本身是没有意义的。
"%.2f" % (math.ceil(x * 100) / 100)
只是为了logging。 你可以这样做:
def roundno(no): return int(no//1 + ((no%1)/0.5)//1)
那里,不需要包含/import
使用decimal
模块: http : //docs.python.org/library/decimal.html
Hier是我的解决scheme,用于向上/向下的问题
<.5向下
> = .5整理
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