python 中 float 和 decimal 的区别

decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档请参考官方说明文档: decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档

举例:

# 使用 Decimal 类型进行计算
from decimal import Decimaltotal_float = 0.1 + 0.2
total_decimal = Decimal('0.1') + Decimal('0.2')
print("[0.1 + 0.2] 使用 float 类型进行计算:", total_float)      # 输出可能是 0.30000000000000004,而不是期望的 0.3
print("[0.1 + 0.2] 使用 Decimal 类型进行计算:", total_decimal)
print()
print("[1.23 ÷ 0.1] 使用 float 类型进行计算:", (1.23 / 0.1) )   # 输出可能是 12.299999999999999 而不是期望的 12.3
print("[1.23 ÷ 0.1] 使用 Decimal 类型进行计算:", Decimal('1.23') / Decimal('0.1'))
print("[1.23 ÷ 0.1] 使用 float ->转成-> Decimal 类型进行计算:", Decimal(1.23) / Decimal(0.1))
print()
print("[1.23 + 0.1] 使用 float 类型进行计算:", (1.23 + 0.1))   # 这个可以正常输出1.33,
print("[1.23 + 0.1] 使用 Decimal 类型进行计算:", (Decimal('1.23')+Decimal('0.1')))

特点Decimalfloatint
数据类型十进制浮点数二进制浮点数整数
精度高精度,适用于金融计算有限精度,可能会存在精度损失无限精度
精确性提供精确的计算结果可能会存在舍入误差精确,没有小数部分
运算速度比 float 类型稍慢比 Decimal 类型稍快最快
内存消耗比 float 类型稍大比 Decimal 类型稍小最小
使用情景金融应用、精确计算科学计算、数据分析计数、索引和简单运算

Decimal('0.1') 跟 Decimal(0.1) 等效吗?

答:

不完全等效。

  • Decimal('0.1'):使用字符串表示的十进制数,可以确保精确地创建 Decimal 对象,因为字符串会被解析为准确的数字。
  • Decimal(0.1):使用浮点数表示的十进制数,由于浮点数本身可能存在精度损失,因此在创建 Decimal 对象时,可能会出现精度损失或不精确的情况。

因此,推荐使用字符串表示法 Decimal('0.1') 来确保精确性。

注意:上下文精度和舍入仅在算术运算期间发挥作用。 getcontext().prec   getcontext().rounding 

getcontext().prec = 6
a = Decimal('3.0')        # 没有发生影响,精度还是1位小数b = Decimal('3.1415926535') # 没有发生影响,精度还是10位小数c = Decimal('3.1415926535') + Decimal('2.7182818285') # 发生影响了,结果是 Decimal('5.85987')getcontext().rounding = ROUND_UPd = Decimal('3.1415926535') + Decimal('2.7182818285')  # 结果是 Decimal('5.85988')

quantize()  用法:

 decimal_object.quantize(exp, rounding=None, context=None)

参数说明

quantize 方法接受一个 Decimal 对象作为exp参数,表示将要量化到的精度。这个参数取值通常是Decimal('0.1')、Decimal('0.01')、Decimal('0.001')、Decimal('0.0001')(但我把这个参数取值为Decimal('1.2'),Decimal('13.55'),Decimal('0.335') 得到的效果是一样的,具体区别是什么,我不知道,未查清楚之前,还是老老实实用0.0001这种形式吧)

  • exp:这个参数是一个 Decimal 对象,表示将要量化到的精度。也可以是一个整数,表示量化到小数点后的位数。

  • rounding:可选参数,用于指定舍入规则。如果不提供该参数,则使用 Decimal 对象的上下文中指定的默认舍入规则。可选的取值有 decimal.ROUND_CEILING, decimal.ROUND_DOWN, decimal.ROUND_FLOOR, decimal.ROUND_HALF_DOWN, decimal.ROUND_HALF_EVEN, decimal.ROUND_HALF_UP, decimal.ROUND_UP, 和 decimal.ROUND_05UP

  • context:可选参数,用于指定 Decimal 操作的上下文环境。如果不提供该参数,则使用当前默认的上下文环境。

from decimal import Decimal# 小数位数作为变量
decimal_places = 2exp = Decimal('0.1') ** decimal_places# 创建要量化的 Decimal 对象
decimal_object = Decimal('3.14159')# 根据变量的值动态设置量化精度
quantized_result = decimal_object.quantize(exp)print(quantized_result)  # 输出: 3.14

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

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

相关文章

CMU 10-414/714: Deep Learning Systems --hw3

实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量,只不过会有一些额外的属性(如shape、strides)来表明这个flat array在维度上的分布。底层运算(如加法、矩阵乘法)都…

[LeetCode][LCR170]交易逆序对的总数

题目 LCR 170. 交易逆序对的总数 在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。 示例 1&#xf…

【VUE】前端阿里云OSS断点续传,分片上传

什么是OSS: 数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您…

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单,内容区域会自动滚动到对应卡片。内容区域滑动,指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…

线程和进程的区别和联系

一、什么是进程 进程(Process), 是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行 【资源分配和调度】 的一个独立单位。 进程是【程序】的【一次执行】(是计算机中程序的执行过程,而不是计算机中的程序)进程是系统进行【资源分配和…

单调栈,LeetCode 1793. 好子数组的最大分数

一、题目 1、题目描述 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], ..., nums[j]) * (j - i 1) 。一个 好 子数组的两个端点下标需要满足 i < k < j 。 请你返回 好 子数组…

[LeetBook]【学习日记】排序算法——归并排序

主要思想 归并排序是一种分治算法&#xff0c;其排序过程包括分和治分是指将要排序的序列一分为二、二分为四&#xff0c;直到单个序列中只有一个数治是指在分完后&#xff0c;将每两个元素重新组合&#xff0c;四合为二、二合为一&#xff0c;最终完成排序 图片作者&#xf…

Gitlab部署及使用

1. 简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。Gitlab是目前被广泛使用的基于 git 的开源代码管理平台&#xff0c;基于Ruby on Rails构建&#xff0c;主要针对软件开发过程中产生的代码…

taro之Picker,PickerView基础用法

1.Picker 直接上代码 import Taro,{Component} from "tarojs/taro"; import {View,Picker} from tarojs/components import { AtIcon } from taro-ui import { putKey } from /src/utils/storage-utilsclass AgriculturePolicy extends Component{constructor (prop…

MySQL的锁的类型

乐观锁与悲观锁&#xff1a; 乐观锁&#xff08;Optimistic Lock&#xff09;通常不直接锁定数据&#xff0c;而是在更新时检查数据是否已被其他事务修改。如果发现冲突&#xff0c;则放弃本次操作或重试。 悲观锁&#xff08;Pessimistic Lock&#xff09;则是在操作数据之前…

out.as_ptr() as *mut libc::c_char

out.as_ptr() as *mut libc::c_char,这段代码出现在 Rust 语言中&#xff0c;用于将 Rust 字符串类型 (String 或 Vec<u8> 等) 的内部缓冲区指针转换为 C 样式字符串&#xff08;以空字符 ‘\0’ 结尾&#xff09;的可变指针。 out&#xff1a;通常是一个具有内部缓冲区的…

Uni App中去掉访问路径中的#

要启用HTML5历史路由模式&#xff0c;你需要&#xff1a; 确保你的服务器支持HTML5历史API。这意味着服务器应该能够处理在没有#的情况下路由的请求。 在Uni App项目中配置路由模式为history。 在Uni App项目中&#xff0c;你可以在manifest.json文件中配置路由模式。找到&quo…

基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1车辆路径问题&#xff08;Vehicle Routing Problem, VRP&#xff09;概述 4.2 禁忌搜索算法&#xff08;Tabu Search, TS&#xff09;原理 5.完整程序 1.程序功能描述 基于禁忌搜索算法…

Learning to summarize from human feedback

Abstract 人工参考总结以及 ROUGE 指标只是我们真实关心的目标(总结质量)的粗略代表。通过优化人工偏好来显著提升总结质量使用大量高质量的人类比较来训练一个模型来预测人类偏好的总结使用这个模型作为奖励函数对总结策略进行强化学习微调我们模型的效果在 TL;DR 数据集上显…

Spring的炼气之路(炼气三层)

目录 一、容器的介绍 1.1 创建容器 1.1.1 类路径下的XML配置文件 1.1.2 文件系统下的XML配置文件 1.2 获取bean 1.2.1 使用baen名称获取 1.2.2 使用bean名称指定类型 1.2.3 使用bean类型获取 二、注解开发 1.1 注解开发bean 1.2 纯注解开发 三、注解开发之bean的…

漫谈微服务网关

一、什么是服务网关 服务网关 路由转发 过滤器 1、路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去&#xff1b; 2、过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&#xff0c;例如权限校验、限流以及监控等&#xff0c;这些都可以通过…

【Linux】Linux开发工具-vim / 编译器-gcc/g++ / 调试器-gdb / git操作 / 项目自动化构建工具-make/Makefile

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.在Linux写自己的第一个程序 1.1 nano指令 1.2 nano指令的使用 1.2.1 介绍 1.2.2 演示 1.2.2.1 创建.c文件 1.2.2.2 nano cod…

Java后端八股------设计模式

Coffee可以设计成接口。 b

EPSON XV4001BC陀螺仪传感器汽车导航系统的应用

近年来为了提高汽车应用系统的可靠性,传感器融合系统被越来越多的应用到汽车领域,如汽车导航系统中的行人检测和预碰撞警告等,通过提供精准的导航信息,为驾驶员提供更安全,更稳定,更舒适的出行体验,例如在行人检测系统中,只使用低成本的红外传感器不能检测到行人的实际位置,而利…

python 八大排序算法

1、选择排序 选择排序是一种简单直观的排序算法&#xff0c;其工作原理是在未排序序列中找到最小&#xff08;或最大&#xff09;的元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后继续寻找剩余未排序序列中的最小&#xff08;或最大&#xff09;元素&#xff0c;放…