【python基础笔记-3】decimal模块解决浮点数计算精度问题
通过Decimal('123.456')对象实例化后做 + - * / 等运算符操作计算结果不会出现精度问题。
Tips:值得注意的2点是
1.Decimal接收的入参是str,所以如果原本操作的数据类型是float需要提前强转为str。
2.decimal模块中getcontext().prec属性可以设置小数位,但是该设置是全局的,有可能会影响计算结果,比如a/b计算之前a和b已经被四舍五入2位小数了,再通过计算获得的结果必然不准,所以不如必要使用该值时劲量设大点,或者不用该设置,直接把计算结果round处理。
class RepaymentCalculator():
# 等额本金还款计划试算
def EP_cal(self, amount, apr, installments: int, start_date=None) -> list:
# getcontext().prec = 2 ,该设置会有影响mpr计算精度的风险
per_principal = Decimal(str(amount)) / Decimal(str(installments))
mpr = Decimal(str(apr)) / Decimal(str('360')) * Decimal(str('30'))
# print(float(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):
if i == 0:
installment_interest_start_date = start_date + relativedelta(months=i)
else:
installment_interest_start_date = start_date + relativedelta(months=i) + relativedelta(days=1)
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)
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(start_date + relativedelta(months=i + 1),
'%Y-%m-%d')
plans.append(plan_info)
return plans
【python基础笔记-3】decimal模块解决浮点数计算精度问题的更多相关文章
- Python基础笔记系列十一:标准输入输出、文件读写和指针等操作
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...
- Python基础笔记系列一:基本工具与表达式
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
- jmeter 中 浮点数计算精度问题
jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...
- Python基础笔记系列十:模块
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...
- python学习笔记之常用模块(第五天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- Python基础(十)-模块
模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- Python基础笔记1
这篇笔记来自廖雪峰的Python教程. 一.Python基础 Python使用缩进来组织代码块,务必遵守约定俗成的习惯,坚持使用4个空格的缩进. 在文本编辑器中,需要设置把Tab自动转换为4个空格,确 ...
- Python 学习笔记(6)--常用模块(2)
一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...
随机推荐
- 性能测试-IO密集型-直接会话可能会断了,命令执行不了
1.IO密集型模拟命令 该命令会开启1个worker不停的读写临时文件,同时启动6个workers不停的调用sync系统调用提交缓存 stress-ng -i 6 --hdd 1 --timeout ...
- wget 多线程下载 mwget 工具安装
# for centos mini #yum -y install gcc-c++ intltool libssl-dev yum -y install gcc-c++ intltool openss ...
- 使用nodejs中遇到的问题
1.post请求必须使用express的一个中间件body-parser一下不然req.body会一直为空 2.node.js这种东西后端跨域就行,前端就别跨域了,不然会一直报错 3.sql语句那个s ...
- ubuntu18.04 20.04 22.04 环境下的QGIS安装
Linux下的QGIS安装 截至到2022年8月份,最新的qgis版本是 QGIS (3.26.x Buenos Aires) 参考网址:https://qgis.org/en/site/foruse ...
- Scala集合排序
Scala集合排序有三种方法:sorted.sortBy().sortWith() (1)sorted 对一个集合进行自然排序,通过传递隐式的Ordering源码中有两点值得注意的地方:1.sorte ...
- -bash: nslookup: 未找到命令;centos7 安装nslookup
一.安装服务 [root@localhost ~]# yum -y install bind-utils 二.查看 [root@localhost ~]# nslookup
- got multiple values for keyword argument 'to_fields'
django.db.models.fields.related.ForeignObject.__init__() got multiple values for keyword argument 't ...
- WPF绑定(4)
什么是绑定(Binding)? 在winform中, 我们常常会用到各种类型的赋值, 例如: button1.Text="Hello"; label.Text="Hell ...
- python获取当前运行函数名
两种方式: #!/usr/bin/env python3#coding:utf-8 import sys, inspectdef test_a(): print('func name: ', sys. ...
- git log 查看修改历史
git log 后面可以跟文件名,表示查看对应文件的修改记录 git log --pretty=oneline --format="%h:%ad:%an:%s" -5 git lo ...