1.2 decimal模块

1 >>> 0.1 + 0.1 +0.1 == 0.3
2 False
3 >>>
4 >>> print(0.1 + 0.1 + 0.1)
5 0.30000000000000004

what???

0.1 + 0.1 +0.1 == 0.3 判断为假
0.1 + 0.1 + 0.1 == 0.30000000000000004

可见Python中的浮点数的存储是不精确的。为毛捏?

因为内置的二进制浮点数实现 float是不精确的,这是二进制的问题。

不过直观地看上去,二进制浮点数与实际数值的差距很小。但金融应用、科学计算等需要精确十进制表达的场合就不行了,为了确保十进制数位精度,或者用户希望计算结果与手算相符的场合。Decimal 重现了手工的数学运算。 高精度使 Decimal 可以执行二进制浮点数无法进行的模运算和等值测试。

下面正式进入decimal模块的学习了。

第一步:国际惯例,想使用,先导入

from decimal import Decimal

第二步:使用它

>>> from decimal import Decimal
>>> Decimal(‘7.1‘) / Decimal(‘3.1‘)
Decimal(‘2.290322580645161290322580645‘)

这个demo中有3个知识点:

  (1)Decimal()的参数是字符串,如果不注意这一点,把浮点数作为参数传递进来,得到的结果还是不精确的

    >>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1)

    Decimal(‘0.3000000000000000166533453694‘)
    >>>
    >>> Decimal(1.2) + Decimal(1.8)
    Decimal(‘3.000000000000000000000000000‘)
    >>> Decimal(‘1.2‘) + Decimal(‘1.8‘)
    Decimal(‘3.0‘)
    >>>

  (2)计算结果返回的还是Decimal类型 ,可以用float()函数将其转换为浮点数

      >>> a = Decimal(‘7.1‘) / Decimal(‘3.1‘)
      >>> float(a)
      2.2903225806451615

    Decimal类型能通过int()转换为整型吗?

      >>> b = Decimal(‘1.0‘) + Decimal(‘1.0‘)
      >>> int(b)
      2
      >>>
      >>> c = Decimal(‘1.0‘) + Decimal(‘1.1‘)
      >>> int(c)
      2                 #哦,这样啊,转换成整数的时候是只取整数部分的,不试一下还真不知道

  (3)浮点型计算中经常会遇到的一个问题,两数相除,但不能相除的情况

      >>> Decimal(‘2‘) / Decimal(‘3‘)

      Decimal(‘0.6666666666666666666666666667‘)     #小数点后面这么多位啊,可是要那么多位没什么用啊,肿么办?

    可以事先自定义一下Decimal计算的精度

      >>> Decimal(‘1.0‘) / Decimal(‘3.0‘)

      Decimal(‘0.3333333333333333333333333333‘)
      >>>
      >>> from decimal import getcontext
      >>> getcontext().prec = 4
      >>> Decimal(‘1.0‘) / Decimal(‘3.0‘)
      Decimal(‘0.3333‘)
      >>>

原文地址:https://www.cnblogs.com/avention/p/8152002.html

时间: 2024-10-07 02:28:04

1.2 decimal模块的相关文章

decimal模块

Python十进制数学计算模块decimalPython提供了decimal模块用于十进制数学计算,它具有以下特点: 提供十进制数据类型,并且存储为十进制数序列:有界精度:用于存储数字的位数是固定的,可以通过decimal.getcontext().prec=x 来设定,不同的数字可以有不同的精度浮点:十进制小数点的位置不固定(但位数是固定的)decimal的构建: 可以通过整数.字符串或者元组构建decimal.Decimal,对于浮点数需要先将其转换为字符串 decimal的context:

用decimal模块增加python的浮点数精度

浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里面getcontext()函数里面的prec参数,来决定你想要的浮点数精度. from decimal import Decimal from decimal import getcontext work_context = getcontext() work_context.prec = 100

decimal模块 --数字的精度、保留小数位数、取整问题

开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应范围值 from decimal import getcontext,Decimal getcontext().prec = 3 #设置精度值为3 f = 12.23435521 #type(f) : float value = Decimal(str(f)) #value: Decimal('12.23435521') #或:value = Dec

python decimal和fractions模块

1.简介 默认,浮点数学缺乏精确性 decimal 模块提供了一个 Decimal 数据类型用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度,或者用户希望计算结果与手算相符的场合.Decimal 重现了手工的数学运算,这就确保了二进制浮点数无法精确保有的数据精度. 高精度使 Decimal 可以执行二进制浮点数无法进行的模运算和等值测试. 2.使用 >>> from d

Python3 学习第十弹: 模块学习三之数字处理

math模块 提供基础的数学函数, cos(3.14) = -0.999..(弧度制) acos(1) = 0.0 sqrt(9) = 3.0 degrees(3.14) = 179.9999..(弧度转角度) radians(180) = 3.1415926..(角度转弧度) 常量 pi = 3.1415.. e = 2.7182.. cmath模块(complex math, 复数) 支持复数的运算, >>>import cmath >>>cmath.sqrt(-1

python的标准模块

本文用于记录python中的标准模块,随时更新. decimal模块(解决小数循环问题): >>> import decimal >>> a = decimal.Decimal('10.0') >>> b = decimal.Decimal('3') >>> a / b Decimal('3.333333333333333333333333333') fractions模块(解决分数表示问题): >>> from f

数字相关模块

整数可以利用bit_ length函 数测试所占的位数a =1;a.bit_ length()#a = 1024;a.bit length() # 11repr和str:显示格式的区别repr格式:默认的交互模式回显,产生的结果看起来它们就像是代码.str格式:打印语句,转化成一种对用户更加友好的格式.""" 数字相关的模块# math模块# Decimal模块:小数模块import decimalfrom decimal import DecimalDecimal(&quo

float精度丢失问题解决,用decimal.Decimal

首先来看一个浮点数运算:下面,当2个float类型数据,进行运算,就不能保证精度 a = 0.1b = 0.3print(a)print(b)print(b-a) 那么,怎么让上面的减法值,得到我们想要的 0.2 呢?导入 decimal模块,如果要不丢失精度Decimal类中必须要接收的是 str类型,如果还是传入 float类型,那么精度还是会丢失 import decimala = 0.1b = 0.3print(decimal.Decimal(str(b)) - decimal.Deci

decimal常用操作和需要注意的地方

decimal模块 简介 decimal意思为十进制,这个模块提供了十进制浮点运算支持. 常用方法 1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确. 2.要从浮点数据转换为Decimal类型 from decimal import * Decimal.from_float(12.222) # 结果为Decimal('12.2219999999999995310417943983338773250579833984375') 3.通过设定有效数字,限定结