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])
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 >>>
But there are exceptions to the above rule 2, such as:
>>> round(0.645,2) 0.65 >>>
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 >>>
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'
So how to obtain a method consistent with the mathematical rounding rules? Please use method two:
, 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}")
The output of the above program is as follows:
0.645 的近似值为 0.65 2.5 的近似值为 3
It fully conforms to our mathematical rounding.
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.
[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!