Python处理浮点数的实用技巧

news2025/1/11 0:20:05

b8c6e6c30ac35f2a9a352d456857ef07.png

更多Python学习内容:ipengtao.com

四舍五入是一种常见的数学操作,它用于将数字舍入到指定的精度。Python 提供了多种方法来实现四舍五入操作,从基本的 round 函数到高级的 decimal 模块,满足不同的需求。本文将详细介绍这些方法,并提供具体的示例代码,帮助全面掌握在 Python 中进行四舍五入操作的技巧。

使用 round 函数进行四舍五入

round 函数是 Python 中最基本的四舍五入方法。它可以将一个数字四舍五入到指定的位数。

基本用法

round 函数的基本语法如下:

round(number, ndigits)
  • number:要四舍五入的数字。

  • ndigits:指定四舍五入到小数点后的位数。如果省略此参数,则默认四舍五入到整数。

# 四舍五入到整数
print(round(3.14159))  # 输出:3

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

# 四舍五入到小数点后一位
print(round(2.675, 2))  # 输出:2.67

在这个示例中,round 函数将数字 3.14159 四舍五入到整数和小数点后两位。此外,还展示了四舍五入操作中的一个常见陷阱,round(2.675, 2) 的结果是 2.67,而不是预期的 2.68,这是由于浮点数精度问题导致的。

使用 math 模块进行四舍五入

math 模块提供了一些用于数学运算的函数,其中包括 math.floormath.ceil,可以用于实现向下取整和向上取整。

向下取整

math.floor 函数用于将数字向下取整,即取不大于该数的最大整数。

import math

print(math.floor(3.7))  # 输出:3
print(math.floor(-3.7))  # 输出:-4

向上取整

math.ceil 函数用于将数字向上取整,即取不小于该数的最小整数。

import math

print(math.ceil(3.3))  # 输出:4
print(math.ceil(-3.3))  # 输出:-3

使用 decimal 模块进行精确四舍五入

decimal 模块提供了对十进制定点和浮点数的支持,能够进行更加精确的四舍五入操作。它是处理金融和货币计算的理想选择。

基本用法

首先需要导入 decimal 模块,然后创建 Decimal 对象进行运算。

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

# 创建 Decimal 对象
num = Decimal('2.675')

# 四舍五入到小数点后两位,采用 ROUND_HALF_UP 策略
rounded_num = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded_num)  # 输出:2.68

# 四舍五入到小数点后两位,采用 ROUND_HALF_EVEN 策略
rounded_num = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
print(rounded_num)  # 输出:2.67

在这个示例中,Decimal 对象提供了更高的精度,并且可以通过指定舍入策略来控制四舍五入的行为。

常用的舍入策略包括 ROUND_HALF_UP(四舍五入)和 ROUND_HALF_EVEN(银行家舍入法)。

使用 numpy 模块进行四舍五入

numpy 是一个用于科学计算的库,提供了强大的数组操作功能。numpy 也提供了用于四舍五入的函数。

基本用法

numpy.round 函数可以对数组中的每个元素进行四舍五入。

import numpy as np

# 创建数组
arr = np.array([3.14159, 2.675, 3.5])

# 四舍五入到整数
rounded_arr = np.round(arr)
print(rounded_arr)  # 输出:[3. 3. 4.]

# 四舍五入到小数点后两位
rounded_arr = np.round(arr, 2)
print(rounded_arr)  # 输出:[3.14 2.67 3.5 ]

在这个示例中,numpy.round 函数对数组中的每个元素进行了四舍五入操作。

自定义四舍五入函数

在某些情况下,可能需要自定义四舍五入的行为。可以编写一个自定义函数来实现这一功能。

def custom_round(number, ndigits=0):
    factor = 10 ** ndigits
    return int(number * factor + 0.5 if number >= 0 else number * factor - 0.5) / factor

print(custom_round(2.675, 2))  # 输出:2.68
print(custom_round(3.14159, 3))  # 输出:3.142
print(custom_round(-3.14159, 2))  # 输出:-3.14

在这个示例中,custom_round 函数通过调整乘数和除数实现了自定义的四舍五入操作。

四舍五入在实际应用中的场景

金融计算

在金融计算中,四舍五入通常用于处理货币金额,以确保结果具有正确的精度。例如,在计算利息、税款或折扣时,需要将结果四舍五入到最接近的分位数或其他指定的精度。

假设需要计算存款利息,并将结果四舍五入到最接近的分位数。

from decimal import Decimal, ROUND_HALF_UP

def calculate_interest(principal, rate, time):
    interest = principal * (rate / 100) * time
    interest = Decimal(interest).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
    return interest

principal = 1000.0  # 本金
rate = 3.75  # 年利率
time = 1  # 时间(年)

interest = calculate_interest(principal, rate, time)
print(f"利息:{interest} 元")  # 输出:利息:37.50 元

在这个示例中,使用 decimal.DecimalROUND_HALF_UP 将计算结果四舍五入到两位小数,以表示正确的货币金额。

数据处理与分析

在数据处理和分析过程中,四舍五入可以用于格式化数据结果,便于展示和进一步计算。例如,在统计学计算中,可能需要将平均值、标准差等结果四舍五入到指定的精度。

假设需要计算一组数据的平均值,并将结果四舍五入到两位小数。

import numpy as np

def calculate_average(data):
    average = np.mean(data)
    return round(average, 2)

data = [2.678, 3.456, 4.789, 5.123, 3.876]

average = calculate_average(data)
print(f"平均值:{average}")  # 输出:平均值:4.00

在这个示例中,我们使用 numpy 计算数据的平均值,并使用 round 函数将结果四舍五入到两位小数。

科学计算

在科学计算中,四舍五入用于控制计算结果的精度,以避免过多的小数位影响结果的可读性和意义。例如,在物理学计算中,可能需要将结果四舍五入到适当的有效位数。

假设需要计算物体的速度,并将结果四舍五入到三位有效位数。

from decimal import Decimal, ROUND_HALF_UP

def calculate_speed(distance, time):
    speed = distance / time
    speed = Decimal(speed).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)
    return speed

distance = 123.456  # 距离(米)
time = 12.34  # 时间(秒)

speed = calculate_speed(distance, time)
print(f"速度:{speed} 米/秒")  # 输出:速度:10.005 米/秒

在这个示例中,使用 decimal.DecimalROUND_HALF_UP 将计算结果四舍五入到三位有效位数,以获得更精确的物理量。

报告生成

在生成报告时,四舍五入可以用于将结果格式化为指定的精度,以便于阅读和理解。例如,在生成财务报告或统计报告时,可能需要将数字四舍五入到适当的位数。

假设需要生成一个简单的财务报告,并将所有金额四舍五入到两位小数。

from decimal import Decimal, ROUND_HALF_UP

def format_amount(amount):
    return Decimal(amount).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)

data = {
    '收入': 123456.789,
    '支出': 98765.432,
    '净利润': 24691.357
}

formatted_data = {k: format_amount(v) for k, v in data.items()}

print("财务报告")
for item, amount in formatted_data.items():
    print(f"{item}:{amount} 元")

在这个示例中,使用 decimal.DecimalROUND_HALF_UP 将财务数据四舍五入到两位小数,并生成格式化的报告。

温度转换

在实际应用中,温度转换是一个常见的场景。我们可能需要将摄氏温度转换为华氏温度,或者反过来,并将结果四舍五入到适当的精度。

假设需要将摄氏温度转换为华氏温度,并将结果四舍五入到一位小数。

def celsius_to_fahrenheit(celsius):
    fahrenheit = celsius * 9/5 + 32
    return round(fahrenheit, 1)

celsius = 36.6
fahrenheit = celsius_to_fahrenheit(celsius)
print(f"{celsius} 摄氏度 = {fahrenheit} 华氏度")  # 输出:36.6 摄氏度 = 97.9 华氏度

在这个示例中,使用 round 函数将转换结果四舍五入到一位小数。

总结

本文详细介绍了在Python中实现四舍五入的多种方法,包括使用round函数、math模块、decimal模块、numpy模块以及自定义四舍五入函数。通过具体的示例代码展示了这些方法在不同应用场景中的使用,如金融计算、数据处理与分析、科学计算、报告生成和温度转换。掌握这些技巧,可以在实际工作中更高效地进行数据处理和分析,提高计算的精度和结果的可靠性。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

2174e5e927466ae8fd7378c7de77cd14.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

f088609832a203f5de1d2903ee3f3097.jpeg

往期推荐

历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)

Python基础学习常见的100个问题.pdf(附答案)

学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Profibus DP主站转Modbus网关连接伺服与电机通讯

在工业自动化领域,将Profibus DP主站转Modbus网关(XD-MDPBM20)用于连接伺服与电机通讯是一种常见且重要的应用方式。当使用Profibus DP主站转Modbus网关(XD-MDPBM20)连接伺服与电机进行通讯时,可以参考以下…

使用代理,在Mapper层面统一封装VO、Entity 之间的转换逻辑

无聊看看开源项目,无意间看到里面的业务代码用到了BaseMapperPlus,于是点进去发现里面封装了Vo、Entity 之间的转换逻辑。想着自己平时都是手动的进行 copy 转换来着。于是本地进行验证了一番,发现还挺好用的,懒人必备。但是前提是…

MySQL 9.0 悄悄上线,支持面向AI的向量数据库

MySQL狂热粉丝群已经发现MySQL官网上MySQL9.0这两天悄然上线,已经可以下载体验了,目前被定义为创新版本(Innovation)。 下载地址:https://dev.mysql.com/downloads/mysql/ 支持主流的操作系统,安装后可以直…

101 个现实世界的新一代 AI 用例

自从一年半前生成式人工智能首次引起世界关注以来,人们一直在热烈讨论这项新技术的最佳用途。虽然我们都喜欢早期的有趣聊天和诙谐的打油诗,但我们很快发现,许多最大的人工智能机会显然都在企业中。 短短几个月内,这些组织就从 A…

tcp/ip, http 等协议的端口号

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…

大模型应用:一文搞懂Fine-tuning,模型微调有啥好处,从理论到实操

前言 我们前面几篇博文中出现的大模型,都是通用的大模型。但在更专业的领域,需要更专业的模型,这就需要用到模型微调的能力。 从NLP范式发展的趋势来看,prompt模型的方式已经成为主流,prompt learning已经很成熟了&a…

Linux 搭建 Kafka 环境 - 详细教程

目录 一. Kafka介绍 1. 应用场景 2. 版本对比 二. Kafka安装 1. 前置环境 (1)安装JDK 2. 软件安装 (3)环境变量配置 (3)服务启动 三. Console测试 基础命令 (1)列出Kafk…

大模型分布式训练的第四种境界

主要内容包括: \1. 历史背景 \2. 分布式训练挑战 \3. 分布式训练技术体系 \4. 未来挑战 \5. Q&A 01 历史背景 自 2019 年以来,大语言模型发展迅猛,不断有新的研究成果涌现,包括各类预训练模型及其应用,如 LL…

Vue86-Vuex中的getters属性

一、getters的使用 1-1、index.js中getters的书写 计算属性computed靠return获得返回值! 1-2、组件中getters的调用 state是数据源,getters是拿着数据源里的东西进行一番加工。像极了:data和computed 二、小结

从0到1手写vue源码

模版引擎 数组join法(字符串) es6反引号法(模版字符串换行) mustache (小胡子) 引入mustache 模版引擎的使用 mustache.render(templatestr,data)

从零开始学LangChain(3):数据接入层

LangChain 主体分为 6 个模块,分别是对(大语言)模型输入输出的管理、外部数据接入、链的概念、(上下文记忆)存储管理、智能代理以及回调系统,通过文档的组织结构,你可以清晰了解到 LangChain的侧…

视频网关的作用

在数字化时代,视频通信已经成为了人们日常生活和工作中的重要部分。为了满足不同设备和平台之间的视频通信需求,各种视频协议应运而生。然而,这些协议之间的差异使得相互通信变得复杂。因此,视频网关作为一种重要的网络设备&#…

2024年【安全生产监管人员】考试题及安全生产监管人员试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题根据新安全生产监管人员考试大纲要求,安全生产模拟考试一点通将安全生产监管人员模拟考试试题进行汇编,组成一套安全生产监管人员全真模拟考试试题,学员可通…

65.Python-web框架-Django-免费模板django-datta-able的admin_datta

目录 1.起源 2.admin_datta admin_datta\urls.py admin_datta\views.py 1.起源 前面有一篇文章介绍了django-datta-able:54.Python-web框架-Django-免费模板django-datta-able_danjon web框架商用免费-CSDN博客 页面是这个样子。 从template\include\sidebar.…

人民数据“数据资产入表高级研修班”正式上线

人民数据与北京龙腾亚太教育咨询有限公司定于8月10日至8月11日联合举办“数据资产入表高级研修班”,欢迎报名。 课程介绍: 01 公共数据的价格形成与价值评估 02 数据资产化实践探索 03《企业数据资源相关会计处理暂行规定》要点解析与入表意义 04 …

干式电抗器与油浸电抗器有什么区别?

干式电抗器和油浸电抗器是电力系统中常用的两种电抗器,它们在结构、性能、应用等方面存在一定的区别。 1. 结构上的区别: 干式电抗器主要由线圈、铁芯和绝缘材料组成,没有油箱,线圈和铁芯直接暴露在空气中。因此,干式…

详解微服务应用灰度发布最佳实践

作者:子丑 本次分享是站在 DevOps 视角的灰度发布实践概述,主要内容包括以下四个方面: 第一,灰度发布要解决的问题; 第二,灰度发布的四种典型场景; 第三,如何把灰度发布融入到应…

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer(encode_send_frame_internal)1.1.1 frame的引用函数(av_frame_ref )1.1.1.1 帧属性的拷贝(frame_copy_props)1.1.1.2 buffer的引用函数&#xf…

从零开始了解视频直播美颜SDK与主播美颜工具

时下,美颜SDK与主播美颜工具应运而生,为视频直播的画质提升提供了强有力的技术支持。 一、什么是美颜SDK? 美颜SDK是一种软件开发工具包,开发者可以将其集成到自己的应用程序中,以实现实时美颜功能。通过美颜SDK&…

巴西社交APP出海热潮!本土网盟CPI流量助力海外广告引流新方向

巴西社交APP出海热潮!本土网盟CPI流量助力海外广告引流新方向 在巴西这个充满活力与多元文化的国家,社交APP的推广和营销策略需要深入了解和适应其独特的市场环境。本土网盟流量投放作为一种有效的推广手段,正逐渐成为众多企业和开发者关注的…