【python基础笔记-3】decimal模块解决浮点数计算精度问题
时间:2021-09-06
本文章向大家介绍【python基础笔记-3】decimal模块解决浮点数计算精度问题,主要包括【python基础笔记-3】decimal模块解决浮点数计算精度问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
通过Decimal('123.456')对象实例化后做 + - * / 等运算符操作计算结果不会出现精度问题。
Tips:值得注意的2点是
1.Decimal接收的入参是str,所以如果原本操作的数据类型是float需要提前强转为str。
2.decimal模块中getcontext().prec属性可以设置小数位,但是该设置是全局的,有可能会影响计算结果,比如a/b计算之前a和b已经被四舍五入2位小数了,再通过计算获得的结果必然不准,所以不如必要使用该值时劲量设大点,或者不用该设置,直接把计算结果round处理。
from decimal import Decimal, getcontext from datetime import datetime from dateutil.relativedelta import relativedelta class RepaymentCalculator(): # 等额本金还款计划试算 def EP_cal(self, amount, apr, installments: int, start_date=None) -> list: # getcontext().prec = 2 ,此操作有风险 per_principal = Decimal(str(amount)) / Decimal(str(installments)) mpr = Decimal(str(apr)) / Decimal(str('360')) * Decimal(str('30')) # print(float(mpr)) ,如果上面设置了prec=2此时计算出来的mpr必然不准确 if start_date == None: start_date = datetime.today() else: start_date = datetime.strptime(start_date, '%Y-%m-%d') plans = [] for i in range(0, installments): installment_interest_start_date = start_date + relativedelta(months=i) plan_info = {} principal = Decimal(str(amount)) - Decimal(str(per_principal)) * Decimal(str(i)) interest = Decimal(str(principal)) * Decimal(str(mpr)) plan_info['principal'] = round(float(per_principal), 2) # 先通过Decimal计算,再float转换,再round取精度 plan_info['interest'] = round(float(interest), 2) plan_info['installment'] = i + 1 plan_info['installment_interest_start_date'] = datetime.strftime(installment_interest_start_date, '%Y-%m-%d') plan_info['due_date'] = datetime.strftime(installment_interest_start_date + relativedelta(months=1), '%Y-%m-%d') plans.append(plan_info) return plans
原文地址:https://www.cnblogs.com/wayne-tou/p/15235003.html
- 转-Golang语言Interface漫谈
- WordPress导航菜单图标字体插件font awesome 4 menus纯代码版
- Oracle 12c远程克隆PDB的问题及修复(r12笔记第78天)
- Oracle表中含有255列以上时需要注意的(r12笔记第77天)
- Golang语言--资源自动回收技术
- Oracle 12.2中的一个参数说明(r12笔记第76天)
- Golang语言社区--【游戏服务器知识】多线程并发
- 用100行Nodejs代码写微博爬虫
- MySQL无法创建表的问题分析(r12笔记第73天)
- Golang语言社区--【H5游戏开发基础知识】JavaScript 用法
- Oracle中的PGA监控报警分析二(r12笔记第87天)
- Oracle 12c PDB的数据备份恢复(r12笔记第84天)
- MySQL和Oracle中唯一性索引的差别(r12笔记第83天)
- 如何用JavaScript进行数组去重
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现截图和分享功能的代码
- Android 自定义相机及分析源码
- Android实现微博菜单弹出效果
- Android开发之拖动条和评分组件用法分析
- Android使用AsyncQueryHandler实现获取手机联系人功能
- Android用过TextView实现跑马灯效果的示例
- android如何设置Activity背景色为透明色
- Android 手机防止休眠的两种实现方法
- Android编程实现的首页左右滑动切换功能示例
- 零基础学小程序004----小程序post请求,提交数据到服务器,小程序下单,小程序用户注册功能
- HorizontalScrollView水平滚动控件使用方法详解
- Android Activity生命周期和堆栈管理的详解
- Android学习之SharedPerference存储详解
- Android编程实现对话框Dialog背景透明功能示例
- Android开发中DatePicker日期与时间控件实例代码