python Decimal这个类处理浮点数精度
浮点数在内存中存储的时候因为存储机制的原因,天然存在精度丢失的现象,比如2.2*3不等于6.6.所以小数在计算的时候值的精度一直是个问题。Decimal就是来处理精度问题。但是处理过后性能堪忧。所以写代码的,除浮点数之外参与运算,其他尽量不用Decimal处理。
"""浮点数在内存中存储的时候因为存储机制的原因,天然存在精度丢失的现象"""
# 比如 2.2 *3 并不是等于6.6
a = 2.2 *3 # 6.6000000000000005
print(a)
# 如果一个数字处在两个整数中间的时候,round方法会返回离的最近的偶数。
print(round(2.5)) # 等于2 而不是四舍五入等于3。看来round函数也不靠谱。
# python的模块decimal
from decimal import *
"""Create a decimal point instance.
>>> Decimal('3.14') # string input
Decimal('3.14')
>>> Decimal((0, (3, 1, 4), -2)) # tuple (sign, digit_tuple, exponent)
Decimal('3.14')
>>> Decimal(314) # int
Decimal('314')
>>> Decimal(Decimal(314)) # another decimal instance44444444444
Decimal('314')
>>> Decimal(' 3.14 \\n') # leading and trailing whitespace okay
Decimal('3.14')
"""
# 1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确
num1 = Decimal("2.2")* 3 # 6.6 返回的是 Decimal类型
print(num1,type(num1))
# 传入的是一个int
num2 = Decimal(2)
print(num2) # 2
# 2.内置函数 float int 可以用来转化Decimal
print(float(num1)) # 6.6
# 3.通过设定有效数字,限定结果样式:
getcontext().prec = 4
print(Decimal("5")/Decimal("7.8")) # 0.6410 4个有效数字
# 4. 四舍五入 quantize(Decimal("2.11")) "2.11"是2个小数点
print(Decimal("0.657").quantize(Decimal("2.11"))) # 0.66
print(Decimal('50.5679').quantize(Decimal('0.00'))) # 50.57
# 5.Decimal 结果转化为string
print(str(Decimal("0.657").quantize(Decimal("2.11")))) # 0.66