Home > Backend Development > Python Tutorial > Have you learned the two methods of rounding in Python?

Have you learned the two methods of rounding in Python?

PHPz
Release: 2023-05-02 13:25:06
forward
3565 people have browsed it

1. Use round

In most cases, we will use round to retain decimals, but this does not comply with the rules in our mathematical knowledge.

round(number[, ndigits])
Copy after login

round() rounds the number (usually a floating point number) according to the following rules (Python3):

Let’s talk about the case where ndigits is not 0:

If the last digit of the reserved digit is less than or equal to 4, then discard it, such as round(5.214,2) = 5.21

If the last digit of the reserved digit is equal to 5, and there is no number after the digit, There will be no carry, such as round(5.215,2) = 5.21

If the last digit of the reserved digit is equal to 5, and there is a number after the digit, then carry will be carried, such as round(5.2151,2) = 5.22

If the last digit of the reserved digit is greater than or equal to 6, carry. For example, round(5.216,2) = 5.22

>>> round(5.214,2)
5.21
>>> round(5.215,2)
5.21
>>> round(5.2151,2)
5.22
>>> round(5.216,2)
5.22
>>>
Copy after login

But there are exceptions to the above rule 2, such as:

>>> round(0.645,2)
0.65
>>>
Copy after login

The reason is that floating point numbers can only represent approximate values ​​when expressed in binary. Although What we see is 0.645. In fact, Python stores 0.645000000000000017763568394002504646778106689453125. Python stores floating point numbers in accordance with the IEEE754 standard.

Let’s talk about the case where ndigits is 0 or None:

If the last digit of the reserved digit is less than or equal to 4, it will be discarded, such as round(1.4) = 1

If the last digit of the reserved digit is equal to 5, and there is no number after it, the nearest even number is taken, such as round(1.5)=2, round(2.5)=2

If the last digit of the reserved digit is If the bit is equal to 5, and there is a digit after it, then the near digit is used, such as round(2.51)=3

If the last digit of the reserved digit is greater than or equal to 6, it is carried. For example, round(1.6) = 2

>>> round(1.5)
2
>>> round(1.4)
1
>>> round(1.6)
2
>>> round(2.5)
2
>>> round(2.51)
3
>>>
Copy after login

Please note that the retained result of f string is consistent with round:

>>> f"{1.5:.0f}"
'2'
>>> f"{2.5:.0f}"
'2'
>>> f"{2.51:.0f}"
'3'
Copy after login

So how to obtain a method consistent with the mathematical rounding rules? Please use method two:

2. There is a premise for using Decimal

, that is, the decimal must be converted into a string first, so that the floating point number can be accurately represented.

import decimal

# 修改舍入方式为四舍五入
decimal.getcontext().rounding = "ROUND_HALF_UP"

x = "0.645"
x1 = decimal.Decimal(x).quantize(decimal.Decimal("0.00"))
print(f"{x} 的近似值为 {x1}")
y = "2.5"
y1 = decimal.Decimal(y).quantize(decimal.Decimal("0"))
print(f"{y} 的近似值为 {y1}")
Copy after login

The output of the above program is as follows:

0.645 的近似值为 0.65
2.5 的近似值为 3
Copy after login

It fully conforms to our mathematical rounding.

Final words

Floating point numbers can only represent approximate values ​​in binary representation. For this point, you can check the document [1]. After understanding the representation of floating point numbers, it won't feel so strange when you look at rounding.

References

[1]Documentation: https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues

The above is the detailed content of Have you learned the two methods of rounding in Python?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:51cto.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template