题解 | #取近似值#

取近似值

https://www.nowcoder.com/practice/3ab09737afb645cc82c35d56a5ce802a

import sys
import math
num1 = float(input())
# print(round(num1))  # 银行家舍入原则,遇到偶数.5的情况会舍而不是入
print(math.floor(num1 + 0.5))

alt

核心知识5:round()函数,math库

round()函数不能实现传统意义上的四舍五入

一、round函数的基本定义与语法(1)(3)(7)

  1. 功能:将数字按指定规则四舍五入到指定位数(2)(6)(10)

  2. 语法round(number, ndigits)

    1. number:需要四舍五入的数值(支持整数、浮点数等)。

    2. ndigits:指定保留的小数位数:

      • 正数:保留小数位(如round(123.456, 2) → 123.46)(1)(6)(7)
      • 0:四舍五入到整数(如round(4.5, 0) → 4.0);
      • 负数:对整数部分四舍五入(如round(1234, -1) → 1230)。

二、round函数的核心规则(2)(7)(10)

  1. 常规四舍五入逻辑

    1. 当要舍去的位数首位 ≥5 时,进位;<5 时舍去(2)(6)(10)
    2. 示例round(2.6) → 3,round(2.4) → 2。
  2. 特殊规则:对0.5的处理

    1. Python的特殊性:当数值为X.5时,round函数会向最近的偶数舍入(称为**“银行家舍入法”**)[用户问题中的现象]:

      • round(2.5) → 2(偶数);
      • round(3.5) → 4(偶数);
      • round(4.5) → 4(偶数);
      • round(5.5) → 6(偶数)。

    alt

  • 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舍入到最近的偶数,使向上和向下舍入的概率均等。例如:

    • round(2.5)2(偶数)

    • round(3.5)4(偶数)

    • round(4.5)4(偶数)

    • round(5.5)6(偶数)这种方式在统计上实现了对称性,长期累积误差更小(1)(3)

2. 为何选择偶数作为基准?

  • IEEE 754标准的要求: Python的round()函数遵循IEEE 754浮点数运算标准,该标准规定在0.5舍入时应采用“向最近的偶数舍入”的策略,以确保计算的一致性和最小化误差(3)

  • 浮点数精度问题的缓解: 计算机浮点数的存储存在精度限制(如0.1+0.2≠0.3),偶数舍入规则能进一步减少因精度误差导致的偏差(2)(7)

3. 与其他工具的对比

  • Excel的ROUND函数: Excel采用传统四舍五入规则(0.5直接进位),例如ROUND(4.5, 0)=5,但其设计目标更偏向用户直观体验而非统计精确性(4)(5)
  • Python的适用场景: 银行家舍入法在金融、科学计算等领域更受青睐,例如财务结算时需避免长期累积的舍入误差(1)(3)

三、与Excel ROUND函数的对比(4)(5)(8)(9)(10)

  1. 相同点

    1. 基础功能一致:均实现四舍五入(2)(7)
    2. 支持整数、小数位数的灵活指定(1)(6)(8)
  2. 关键差异

    1. 0.5的处理

      • Python:向偶数舍入(如round(4.5)=4);
      • Excel:直接进位(如=ROUND(4.5,0)=5)。
    2. 负数位数的用途

      • Python:round(1234, -1) → 1230(舍入到十位);
      • Excel:=ROUND(1234, -1) → 1230,规则一致。

四、实际应用与注意事项(5)(9)(10)

  1. 替代方案

    1. 若需传统四舍五入(0.5始终进位),可使用:

    2. <PYTHON>

       def traditional_round(x):  return int(x + 0.5) # 示例:traditional_round(4.5) → 5
      
    3. Excel中需用ROUNDUPROUNDDOWN实现不同方向的舍入(5)(10)

  2. 常见错误场景

    1. 浮点数精度问题(如0.1 + 0.2可能得到0.30000000000000004),需结合round()处理。

math.floor

math.floor(num1 + 0.5) 实现了正数的传统四舍五入规则,但在负数场景下可能不符合预期。以下是详细分析:

1. 代码逻辑分析

  • 原理:通过将数值 num1 加上 0.5 后向下取整(math.floor()),实现对正数的四舍五入。例如:

    • num1 = 2.52.5 + 0.5 = 3.0math.floor(3.0) = 3(正确)。
    • num1 = 2.42.4 + 0.5 = 2.9math.floor(2.9) = 2(正确)。

2. 正数场景的正确性

  • 符合传统规则:当 num1 的小数部分 ≥ 0.5 时,num1 + 0.5 的整数部分进位;当小数部分 < 0.5 时,直接舍去。例如:

    • round(2.6)3,与 math.floor(2.6 + 0.5) 结果一致。
    • round(2.3)2,与 math.floor(2.3 + 0.5) 结果一致 (2)(6)

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):计算 xy 次幂。

    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 模块。
全部评论

相关推荐

震撼沃玛一整年:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务