Python 类货币四舍五入规则
2016-07-25 14:28
531 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangyantsing/article/details/52023356
使用Python做一个简单的数据计算的小工具,后来发现了一个很奇怪的问题。比方说 Round(166.885,2), 你猜结果应该是多少?告诉你吧,结果不是 166.89,而是166.88;猜测一下这个round(116.885),答案该不会不是116.88吧,还真不是,而是116.89. 查看相关资料,这不是Python的bug,而是数据表达方式的原因造成的。
但是这样的逻辑显然不能应用于涉及到货币计算的问题。有建议采用decimal的方式来进行处理,不过我个人觉得使用起来还是颇为麻烦的。所以,参考一些工具,我写了一个简短换算到两位小数的小工具,供大家娱乐和参考。其中,最后一个方法cr_round可以应用于我们日常使用和处理。
测试时持续输入数字即可,按非数字字符退出。
# -*- coding: utf-8 -*- """ Created on Mon Jul 25 10:18:05 2016 @author: 老王头 0 Normal 1 Commercial rounding to Yuan 2 Commercial rounding to Jiao 3 Rounding down to Yuan 4 Rounding down to Jiao 5 Rounding up to Yuan 6 Rounding up to Jiao 7 Rounding from Fen to Jiao 8 Rounding from Jiao to Yuan 9 Round with decimals with normal practice """ import math class clround: def cr0_norm(self,number): temp = number * 100 value = math.floor(temp) if (abs(temp - value) < 0.5): pass else: value = value + 1 value = value / 100.0 return value def cr1_toyuan(self,number): value = math.floor(number) if (abs(number - value) < 0.5): pass else: value = value + 1 return value def cr2_tojiao(self,number): temp = number * 10 value = math.floor(temp) if (abs(temp - value) < 0.5): pass else: value = value + 1 return value / 10.0 def cr3_downyuan(self,number): return math.floor(number) def cr4_downjiao(self,number): temp = number * 10 value = math.floor(temp) /10 return value # consider the number after fen,like 4 decimal def cr5_upyuan(self,number): temp = math.floor(number * 1000) / 1000 value = math.floor(temp) if(abs(value - number) >0 ): value = value + 1 else: pass return value def cr6_upjiao(self,number): temp = math.floor(number * 10000)/1000 value = math.floor(temp) if(abs(value - temp) > 0 ): value = value + 1 else: pass return value/10 # consider the number only before fen def cr7_f2j(self,number): temp = math.floor(number * 100) /10 value = math.floor(temp) if(abs(value - temp) > 0 ): value = value + 1 else: pass return value/10 def cr8_j2y(self,number): temp = math.floor(number * 10) value = math.floor(temp) if(abs(value - temp) > 0 ): value = value + 1 else: pass return value/10 def cr_round(self,number,decimals): fact = 10 ** decimals temp = number * fact value = math.floor(temp) if(abs(value-temp)<0.5): pass else: value = value + 1 return value / fact if __name__ == "__main__": cr = clround() input_flag = True while(input_flag == True): try: in_num = float(input("Please input a number:")) except: input_flag = False value = cr.cr0_norm(in_num) print("Normal", value) value = cr.cr1_toyuan(in_num) print("Normal to Yuan",value) value = cr.cr2_tojiao(in_num) print("Normal to Jiao",value) value = cr.cr3_downyuan(in_num) print("Down yuan",value) value = cr.cr4_downjiao(in_num) print("Down Jiao",value) value = cr.cr5_upyuan(in_num) print("Up yuan",value) value = cr.cr6_upjiao(in_num) print("Up Jiao",value) value = cr.cr7_f2j(in_num) print("Up Fen to Jiao",value) value = cr.cr8_j2y(in_num) print("Up Jiao to Yuan",value) value = cr.cr_round(in_num,2) print("2 decimals",value) value = cr.cr_round(in_num,3) print("3 decimals",value) value = cr.cr_round(in_num,4) print("4 decimals",value)
相关文章推荐
- python处理Unicode规则
- python的一些规则
- round函数四舍五入的规则(4舍6入5奇进偶不进)
- Python的变量赋值及函数参数传递规则
- Python 变量类型及命名规则介绍
- 详解python校验SQL脚本命名规则
- 保持小数点后面两位四舍五入 python
- Python培训day003——诡异的四舍五入
- python eve restful 规则
- 关于python3.x的除法、向上向下取整及四舍五入的问题
- Python 中特殊变量/方法命名规则说明(特别是私有变量)及使用实例
- Python编写规则值得收藏
- Python的类实例属性访问规则探讨
- Python 命名空间 及变量搜索规则 属性名称 属性名称 无点号运算的变量名
- python 根据文件替换规则批量替换字符串
- python 正则表达式规则收集
- python 正则表达式(二) 元字符使用规则
- 关于python3中round()函数的四舍五入问题
- python网络爬虫-使用API之API通用规则
- Python 的 LEGB 规则(转载)