Python十进制数学计算模块decimal

转自:http://www.cnblogs.com/moinmoin/archive/2011/09/26/2190720.html

Python提供了decimal模块用于十进制数学计算,它具有以下特点:

  1. 提供十进制数据类型,并且存储为十进制数序列;
  2. 有界精度:用于存储数字的位数是固定的,可以通过decimal.getcontext().prec=x 来设定,不同的数字可以有不同的精度
  3. 浮点:十进制小数点的位置不固定(但位数是固定的)

decimal的构建:

可以通过整数、字符串或者元组构建decimal.Decimal,对于浮点数需要先将其转换为字符串

decimal的context:

decimal在一个独立的context下工作,可以通过getcontext来获取当前环境。例如前面提到的可以通过decimal.getcontext().prec来设定小数点精度(默认为28):

>>> from decimal import Decimal as D
>>> from decimal import getcontext  
>>> getcontext()
Context(prec=6, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[Rounded, Inexact], traps=[DivisionByZero, InvalidOperation, Overflow])
>>> getcontext().prec = 6 
>>> D(1)/D(3) 
Decimal('0.333333')

decimal和float性能对比:

$: python -mtimeit -s 'from decimal import Decimal as D' 'D("1.2")+D("3.4")'
$: python -mtimeit -s 'from decimal import Decimal as D' '1.2+3.4'

我在虚拟机中测试前者耗时是后者的1.7k倍,但这在某些运算(例如财务运算)中是值得的,但如果要对非整数做上百次的运算,应坚持使用float。

以下是一个将人民币数值转换成大写的Python程序: ```python # 定义数字对应的中文字符 digits = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖') units = ('', '拾', '佰', '仟') groups = ('', '万', '亿') def number2chinese(num): """将人民币数值转换成大写""" if num < 0 or num > 999999999999.99: raise ValueError('数值超出范围(0-999999999999.99)') # 将数值分成整数和小数两部分 integer_part, decimal_part = str(round(num, 2)).split('.') integer_part = int(integer_part) decimal_part = int(decimal_part) # 处理整数部分 integer_chinese = '' if integer_part == 0: integer_chinese = digits[0] else: # 从右到左每四位一组,处理每一组 group_index = 0 while integer_part > 0: group = integer_part % 10000 integer_part //= 10000 group_chinese = '' # 处理四位数字 for i in range(4): digit = group % 10 if digit > 0: group_chinese = digits[digit] + units[i] + group_chinese else: # 处理连续的零 if len(group_chinese) > 0 and group_chinese[0] != digits[0]: group_chinese = digits[0] + group_chinese group //= 10 # 处理当前组的单位 if len(group_chinese) > 0: group_chinese += groups[group_index] integer_chinese = group_chinese + integer_chinese group_index += 1 # 处理小数部分 decimal_chinese = '' if decimal_part == 0: decimal_chinese = '整' else: if decimal_part < 10: decimal_part *= 10 for i in range(2): digit = decimal_part % 10 if digit > 0: decimal_chinese = digits[digit] + units[-2 + i] + decimal_chinese else: # 处理连续的零 if len(decimal_chinese) > 0 and decimal_chinese[0] != digits[0]: decimal_chinese = digits[0] + decimal_chinese decimal_part //= 10 return integer_chinese + '元' + decimal_chinese ``` 使用示例: ```python print(number2chinese(123456789.12)) # 输出:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分 ``` 注意:该程序只支持人民币数值的转换,对于其他货币的转换可能需要做相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值