Python中关于小数四舍五入的方法
HDUZN

在Python中,我们经常需要对小数进行四舍五入操作。四舍五入是一种常见的数值处理方式,可以将小数精确到指定的位数。Python提供了多种方法来实现小数的四舍五入操作。

方法一:round()函数

使用内置的round()函数来进行四舍五入。

函数用法:

1
round(number, ndigits)
  • number:要进行四舍五入的数字。
  • ndigits:保留的小数位数,默认为0。如果ndigits为正数,则表示保留的小数位数;如果ndigits为负数,则表示要四舍五入到整数位数。

举例:

1
2
3
4
5
6
7
8
9
10
11
# 四舍五入到整数位数
a = 3.6
print(round(a)) # 输出:4

# 四舍五入到1位小数
a = 3.14159
print(round(a, 1)) # 输出:3.1

# 四舍五入到2位小数
a = 3.14159
print(round(a, 2)) # 输出:3.14

需要注意的是,由于浮点数的精度问题,round()函数可能无法得到准确的结果。如果需要更高精度的四舍五入,建议使用decimal库中的Decimal类。

方法二:format()格式化方法

举例:

1
2
b = 3.14159
print('{:.2f}'.format(b)) # 保留2位小数

缺点与round() 函数一样,由于浮点数的精度问题,可能无法得到准确的结果。

方法三:Decimal类

Decimal类提供了更高精度的十进制运算,可以避免浮点数精度问题。通过使用Decimal类的quantize()方法,可以指定要保留的小数位数,并选择四舍五入的方式进行舍入。

示例代码:

以下是使用Decimal类进行四舍五入的示例代码:

1
2
3
4
5
6
7
8
9
from decimal import Decimal, ROUND_HALF_UP

a = Decimal('543.012355')
rounded_number = a.quantize(Decimal('0.00001'), rounding=ROUND_HALF_UP)
print(rounded_number) # 输出:543.01236

b = 543.012355
print(round(b, 5)) # 输出:543.01235
print('{:.5f}'.format(b)) # 输出:543.01235
  • a 是一个Decimal对象;
  • Decimal(‘0.00001’)是一个Decimal对象,表示要保留的小数位数为5位;
  • rounding=ROUND_HALF_UP是一个常量,表示采用四舍五入的方式。

通过使用Decimal类,可以获得更准确的四舍五入结果,避免了浮点数精度问题。

其他舍入方式的常量

除了ROUND_HALF_UP,decimal库中还提供了其他舍入方式的常量,可以用作quantize()方法的rounding参数。以下是常用的舍入方式常量:

  • ROUND_DOWN:向零方向舍入。
  • ROUND_UP:远离零方向舍入。
  • ROUND_CEILING:向正无穷方向舍入。
  • ROUND_FLOOR:向负无穷方向舍入。
  • ROUND_HALF_DOWN:向最近的偶数舍入,如果距离两个最近的整数相等,则向下舍入。
  • ROUND_HALF_EVEN:向最近的偶数舍入,如果距离两个最近的整数相等,则向偶数舍入。
  • ROUND_HALF_UP:向最近的偶数舍入,如果距离两个最近的整数相等,则向上舍入。

这些常量可以根据具体的舍入需求进行选择。例如,如果需要向下舍入,可以使用ROUND_DOWN;如果需要向上舍入,可以使用ROUND_UP。

python官方文档上关于round()函数的介绍

round(number, ndigits=None)
Return number rounded to ndigits precision after the decimal point. If ndigits is omitted or is None, it returns the nearest integer to its input.

For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2). Any integer value is valid for ndigits (positive, zero, or negative). The return value is an integer if ndigits is omitted or None. Otherwise, the return value has the same type as number.

For a general Python object number, round delegates to number.round.

Note: The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

译文:

round(number, ndigits=None)
返回小数点后精确到ndigits位的四舍五入值。如果省略ndigits或为None,则返回最接近输入的整数。

对于支持round()的内置类型,值会被四舍五入到10的负ndigits次幂的最接近倍数;如果有两个倍数距离相等,则向偶数方向进行舍入(例如,round(0.5)和round(-0.5)都是0,而round(1.5)是2)。任何整数值都可以作为ndigits的有效值(正、零或负)。如果省略或为None,则返回值为整数。否则,返回值与number具有相同类型。

对于一般Python对象number,round委托给number.__round__。

注意:对浮点数使用round()可能会产生令人惊讶的结果:例如, round(2.675, 2)得到2.67而不是预期中的2.68。这不是一个错误:它是由于大多数十进制分数无法完全表示为浮点型所导致。请参阅《浮点运算问题和限制》获取更多信息。

  • 本文标题:Python中关于小数四舍五入的方法
  • 本文作者:HDUZN
  • 创建时间:2023-09-23 13:10:33
  • 本文链接:http://hduzn.cn/2023/09/23/Python中关于小数四舍五入的方法/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论