Python 类货币四舍五入规则

使用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)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值