您的位置:首页 > 编程语言 > Python开发

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)




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: