美文网首页
py_28 Decimal处理小数计算精度问题

py_28 Decimal处理小数计算精度问题

作者: 阿登20 | 来源:发表于2020-09-21 21:16 被阅读0次

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


相关文章

网友评论

      本文标题:py_28 Decimal处理小数计算精度问题

      本文链接:https://www.haomeiwen.com/subject/ikpbyktx.html