如何将浮点数舍入到给定的精度?
How to round float down to a given precision?
我需要一种方法将浮点数四舍五入到给定的小数位数,但我希望始终向下舍入。
例如,而不是
>>> round(2.667, 2)
2.67
我宁愿
>>> round_down(2.667, 2)
2.66
您可以使用 math.floor
到 "round down" 最接近的整数。所以要四舍五入到小数点后第三位,你可以试试 math.floor(1000*number) / 1000
.
一般来说,要"round down"一个数字num
到精度n
,你可以试试:
from math import floor
def round_down(num, n):
multiplier = pow(10,n)
return floor(num * multiplier) / multiplier
像这样的东西应该适用于你想做的任何数字:
>>> import math
>>> def round_down(num,digits):
factor = 10.0 ** digits
return math.floor(num * factor) / factor
>>> round_down(2.667,2)
2.66
你在 quantize
and ROUND_FLOOR
有一个朋友
>>> from decimal import Decimal,ROUND_FLOOR
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR))
2.66
>>> float(Decimal(str(-2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR))
-2.67
请注意,您可以使用 ROUND_DOWN
for positive numbers. As interjay mentions 、ROUND_DOWN
向零舍入 ,因此可能 return 不正确的负数值。
>>> from decimal import Decimal,ROUND_DOWN
>>> Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('2.66')
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN))
2.66
您也可以使用字符串来解决这个问题
def round_down(num, prec):
if isinstance(num, float):
s = str(num)
return float(s[:s.find('.') + prec + 1])
else:
raise ValueError
round_down(2.6667, 2)
# 2.66
用更多的检查来修补代码,例如精度不为负等。
我需要一种方法将浮点数四舍五入到给定的小数位数,但我希望始终向下舍入。
例如,而不是
>>> round(2.667, 2)
2.67
我宁愿
>>> round_down(2.667, 2)
2.66
您可以使用 math.floor
到 "round down" 最接近的整数。所以要四舍五入到小数点后第三位,你可以试试 math.floor(1000*number) / 1000
.
一般来说,要"round down"一个数字num
到精度n
,你可以试试:
from math import floor
def round_down(num, n):
multiplier = pow(10,n)
return floor(num * multiplier) / multiplier
像这样的东西应该适用于你想做的任何数字:
>>> import math
>>> def round_down(num,digits):
factor = 10.0 ** digits
return math.floor(num * factor) / factor
>>> round_down(2.667,2)
2.66
你在 quantize
and ROUND_FLOOR
>>> from decimal import Decimal,ROUND_FLOOR
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR))
2.66
>>> float(Decimal(str(-2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR))
-2.67
请注意,您可以使用 ROUND_DOWN
for positive numbers. As interjay mentions ROUND_DOWN
向零舍入 ,因此可能 return 不正确的负数值。
>>> from decimal import Decimal,ROUND_DOWN
>>> Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('2.66')
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN))
2.66
您也可以使用字符串来解决这个问题
def round_down(num, prec):
if isinstance(num, float):
s = str(num)
return float(s[:s.find('.') + prec + 1])
else:
raise ValueError
round_down(2.6667, 2)
# 2.66
用更多的检查来修补代码,例如精度不为负等。