题解 | #取近似值#
取近似值
https://www.nowcoder.com/practice/3ab09737afb645cc82c35d56a5ce802a
import sys
import math
num1 = float(input())
# print(round(num1)) # 银行家舍入原则,遇到偶数.5的情况会舍而不是入
print(math.floor(num1 + 0.5))
核心知识5:round()函数,math库
round()函数不能实现传统意义上的四舍五入
一、round函数的基本定义与语法(1)(3)(7)
-
语法:
round(number, ndigits)
二、round函数的核心规则(2)(7)(10)
-
常规四舍五入逻辑:
-
特殊规则:对0.5的处理:
-
Python的特殊性:当数值为
X.5
时,round函数会向最近的偶数舍入(称为**“银行家舍入法”**)[用户问题中的现象]:round(2.5)
→ 2(偶数);round(3.5)
→ 4(偶数);round(4.5)
→ 4(偶数);round(5.5)
→ 6(偶数)。
-
- Excel的差异:Excel的ROUND函数对0.5会直接进位(如
ROUND(4.5,0)=5
)。
Python的round()函数在处理X.5时向最近的偶数舍入,这一规则源于银行家舍入法(Bankers' Rounding),其核心目的是减少统计计算中的累积误差(1)(3)。
1. 规则背后的数学原理
传统四舍五入的偏差问题: 当连续对大量以0.5结尾的数值进行向上舍入时,会系统性地产生正偏差(例如:2.5→3、3.5→4、4.5→5等)。长期统计时,这种偏差可能影响计算的准确性(3)。
偶数舍入的平衡机制: 银行家舍入法通过将0.5舍入到最近的偶数,使向上和向下舍入的概率均等。例如:
2. 为何选择偶数作为基准?
IEEE 754标准的要求: Python的round()函数遵循IEEE 754浮点数运算标准,该标准规定在0.5舍入时应采用“向最近的偶数舍入”的策略,以确保计算的一致性和最小化误差(3)。
浮点数精度问题的缓解: 计算机浮点数的存储存在精度限制(如0.1+0.2≠0.3),偶数舍入规则能进一步减少因精度误差导致的偏差(2)(7)。
3. 与其他工具的对比
三、与Excel ROUND函数的对比(4)(5)(8)(9)(10)
-
相同点:
-
关键差异:
-
0.5的处理:
- Python:向偶数舍入(如
round(4.5)=4
); - Excel:直接进位(如
=ROUND(4.5,0)=5
)。
- Python:向偶数舍入(如
-
负数位数的用途:
- Python:
round(1234, -1)
→ 1230(舍入到十位); - Excel:
=ROUND(1234, -1)
→ 1230,规则一致。
- Python:
-
四、实际应用与注意事项(5)(9)(10)
-
替代方案:
-
常见错误场景:
- 浮点数精度问题(如
0.1 + 0.2
可能得到0.30000000000000004
),需结合round()
处理。
- 浮点数精度问题(如
math.floor
math.floor(num1 + 0.5)
实现了正数的传统四舍五入规则,但在负数场景下可能不符合预期。以下是详细分析:
1. 代码逻辑分析
-
原理:通过将数值
num1
加上0.5
后向下取整(math.floor()
),实现对正数的四舍五入。例如:num1 = 2.5
→2.5 + 0.5 = 3.0
→math.floor(3.0) = 3
(正确)。num1 = 2.4
→2.4 + 0.5 = 2.9
→math.floor(2.9) = 2
(正确)。
2. 正数场景的正确性
-
符合传统规则:当
num1
的小数部分 ≥ 0.5 时,num1 + 0.5
的整数部分进位;当小数部分 < 0.5 时,直接舍去。例如:
Remark: Math库常用函数分类与示例
math
模块是 Python 进行数学计算的核心工具,涵盖数值处理、三角函数、对数与指数运算等场景。通过结合函数和常量,可高效完成复杂计算任务。
1. 数值处理函数 (1) (4) (5) (6) (7) (8)
-
math.ceil(x)
:返回不小于x
的最小整数(向上取整)。math.ceil(2.3) # 输出 3 math.ceil(-2.3) # 输出 -2
-
math.floor(x)
:返回不大于x
的最大整数(向下取整)。math.floor(2.7) # 输出 2 math.floor(-2.7) # 输出 -3
-
math.sqrt(x)
:计算平方根。math.sqrt(16) # 输出 4.0
-
math.fabs(x)
:返回绝对值(浮点类型)。(math库中无abs()
函数,如果直接int类绝对值直接abs()
)math.fabs(-3.14) # 输出 3.14math.abs(-3.14) # AttributeError: module 'math' has no attribute 'abs'. Did you mean: 'fabs'?abs(-3.14) # 输出 3.14
2. 三角函数
-
math.sin(x)
,math.cos(x)
,math.tan(x)
:计算正弦、余弦、正切(输入为弧度)。math.sin(math.pi/2) # 输出 1.0 math.cos(0) # 输出 1.0
-
弧度与角度转换:
math.degrees(math.pi/2) # 弧度转角度,输出 90.0 math.radians(90) # 角度转弧度,输出 1.5707963267948966
3. 对数与指数函数
-
math.log(x, base)
:计算自然对数或指定底数的对数。math.log(100, 10) # 以10为底的对数,输出 2.0 math.log(math.e) # 自然对数,输出 1.0
-
math.exp(x)
:计算math.exp(1) # 输出 2.718281828459045
-
math.pow(x, y)
:计算x
的y
次幂。math.pow(2, 3) # 输出 8.0
4. 数学常量
-
math.pi
:圆周率 π。print(math.pi) # 输出 3.141592653589793
-
math.e
:自然对数的底数 e。print(math.e) # 输出 2.718281828459045
其他常用函数
-
math.factorial(n)
:计算阶乘(n
必须为非负整数)。math.factorial(5) # 输出 120
-
math.modf(x)
:分离数字的整数和小数部分。math.modf(3.14) # 输出 (0.14000000000000012, 3.0)
注意事项
- 浮点精度问题:部分函数结果可能因浮点数精度限制出现微小误差(如
math.sqrt(2)**2
可能不等于2
)。 - 无复数支持:
math
模块不支持复数运算,需使用cmath
模块。