floating-point - python - 如何将浮点数四舍五入到特定的小数位数?

假设我有8.8333333333333339,我想把它转换为 8.84 ,我如何在python中实现这个?

round(8.8333333333333339, 2)提供8.83而且非8.84 ,我是python新手,也是编程新手。

我不想将它打印为字符串,结果将被进一步使用。

时间:

8.833333333339 (或 8.833333333333334106.00/12的结果)正确舍入为两位小数,数学上听起来像你想要的ceiling函数,python模块的math中的一个名为 ceil

 

import math



v = 8.8333333333333339


print(math.ceil(v*100)/100) # -> 8.84



如果你不想使用math模块,你可以使用我刚才编写的(最小测试)实现:

 

def ceiling(x):


 n = int(x)


 return n if n-1 <x <= n else n+1



screenshot of loan calculator output

这是正常的(和 python没有关系),因为8.83不能精确表示为二进制浮点,正如1/3无法完全表示(0.333333),无限)。

如果要确保绝对精度,则需要 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')


>>> 



简单的方法是简单地使用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.833 3333333339至2小数,正确答案是 8.83,而不是 8.84,你得到8.830 00000001是因为 8.83是一个无法正确的reprecented的数字,它给你最近的一个,如果你想在没有全零的情况下进行打印,请按照VGE的说法进行操作:

 

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



如果你想四舍五入,8.84是错误答案,8.833 333333333舍入是8.83而不是8.84。如果你想要总是向上舍入,那么你可以使用math.ceil。在与字符串格式的组合中进行两种操作,因为浮点数本身无意义。

 

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



你可以这样做:

 

def roundno(no):


 return int(no//1 + ((no%1)/0.5)//1)



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

完成这个操作的最简单方法是使用以下内置函数:

 
format()



 

例如:

 

format(1.242563," .2f" )



输出将为:

 
1.24



 

类似地:

 

format(9.165654," .1f" )



将给出:

 
9.2



 

这是我的解决问题的解决方法

<. 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



...