【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 ...
随机推荐
- zabbix编译安装,安装mysql数据库:configure: error: Not found mysqlclient library
在编译时,可能会出现题目中所示的错误,可以通过安装mysql-devel这个库解决: # yum install mysql-devel 注:如果出现"configure: error : ...
- 26 docker 安装 solr
准备一台已经安装过docker的服务器 获得solr镜像 #可以指定版本 docker pull solr:7.5.0docker pull solr:7.7.3 创建数据挂载文件夹 允许访问权限 s ...
- Error:java: 无效的目标发行版: 9
今天碰到一个编译问题,起先以为是jdk版本问题,但是查看了下,发现版本没错. 顿时有一种怀疑人生的感觉. 然后网上找了许久,终于让我找到答案: 下面直接上解决方案: 将版本9改为8,保存,测试运行,可 ...
- debian11命令行安装字体
一.需要用到三条命令mkfontscale/mkfontdir/fc-cache这三条命令属于两个软件包mkfontscale/mkfontdir属于xfonts-utils包,fc-cache命令属 ...
- vue-pc项目放到电视tv上适配
当部署屏幕小于开发屏幕大小的时候,我们通过transform:scale(0.8)对页面进行整体缩放,部署后不生效时,可以找到项目的index.html文件,将viewpoint这一行代码注释掉,或者 ...
- 集群分发xsync xcall kafka启动脚本命令,命令方式安装epel源
安装epel库源 yum install epel-release -y --nogpgcheck yum install glances 安装开始 建立hosts 白名单 127.0.0.1 loc ...
- k8s centos 79,用kuboard-spray装成功。低版本的。安装docker-ce,安装epel源
安装日志 #安装epel源 yum install epel-release -y --nogpgcheck # 安装docker-ce yum install -y yum-utils device ...
- win的安全更新安装不成功,可用下面命令进行强制更新
- windows平台下软件最小化后无法打开的解决方法
今天打开电脑后,双击桌面软件图标,软件启动画面出现,等了几秒后直接最小化窗口,感觉有点奇怪.点击任务栏图标后没有反应,软件界面没出现. 以为软件是不是安装破损什么的,重新安装后问题依旧,奇怪,究竟是什 ...
- kali中MulVAL的安装与配置
我的Kali版本 配置JAVA环境 Kali 2021.3自带openjdk 11的环境 # 验证openjdk11 java --version javac --version 能输出版本号则说明环 ...