>>> 0.1 + 0.1 +0.1 == 0.3
 False
 >>>
 >>> print(0.1 + 0.1 + 0.1)
 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(')

 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')
 >>>
 

1.2 decimal模块的更多相关文章

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

    浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里 ...

  2. decimal模块

    简介 decimal意思为十进制,这个模块提供了十进制浮点运算支持. 常用方法 1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确. 2.要从浮点数据转换为De ...

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

    开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应精度值 from decimal import ge ...

  4. 洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

    decimal 1.作用: 用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度, ...

  5. python decimal和fractions模块

    1.简介 默认,浮点数学缺乏精确性 decimal 模块提供了一个 Decimal 数据类型用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于金融应用和其它需要精确十进制表达的场合, ...

  6. [python]decimal常用操作和需要注意的地方

    decimal模块 简介 decimal意思为十进制,这个模块提供了十进制浮点运算支持. 常用方法 1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确. 2.要 ...

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

    math模块 提供基础的数学函数, cos(3.14) = -0.999..(弧度制) acos(1) = 0.0 sqrt(9) = 3.0 degrees(3.14) = 179.9999..(弧 ...

  8. python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业

    一.昨日内容回顾 1.arp协议含义 2.子网,子网掩码 3.两台电脑在网络中怎么通信的? 4.tcp和udp socket编码 5.tcp和udp协议的区别 6.tcp三次握手和四次挥手,syn洪攻 ...

  9. python的标准模块

    本文用于记录python中的标准模块,随时更新. decimal模块(解决小数循环问题): >>> import decimal >>> a = decimal.D ...

随机推荐

  1. kafka学习

    kafka名词解释和工作方式: Producer :消息生产者,就是向kafka broker发消息的客户端. Consumer :消息消费者,向kafka broker取消息的客户端 Topic : ...

  2. 关于awk的多文件处理

    关于awk的多文件处理: awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如1.shell的Pathname Expansion方式:awk '{...}' *.txt # *.t ...

  3. shell第一篇

    前两天不停的再看内核相关的内容,了解内核的形成.内核的执行流程.内核的作用,结果是舍近求远. 其实我只是想了解一下shell的工作,shell与内核有关,但并不需要我么真正去做什么,至少对于我这样额初 ...

  4. vs调试dll工程

    dll本身是没法运行的,必须在其它工程调用dll时候才会运行. 所以,调试dll首先要将调用dll的工程和dll工程联系起来. 解决方案中添加dll工程: 现在dll 和 应用程序两个工程就都在一个解 ...

  5. 精通libGDX-RPG开发实战

    从今天开始,我会陆陆续续做一个五脏俱全的rpg小品游戏. 素材使用<圣剑英雄传II>的素材 游戏名称< Inspiration > 教程目录(暂定): Chapter 1: 开 ...

  6. Chocolatey 和 Redis windows安装记录

    前言 最近研究redis,发现Redis没有官方的windows版本,但MsOpenTech有一直维护对应的Redis版本,其下载地址如下: https://github.com/MSOpenTech ...

  7. OpenStack和Hadoop的区别

    其实,OpenStack和Hadoop不是同一个层次的东西,无法比较,非要说出个区别,那就是:OpenStack是云计算管理平台,应该是属于系统级别的软件,它的主体思想是把资源进行分离,给不同的用户提 ...

  8. Java设计模式——代理模式

    public interface People { public void work(); } public class RealPeople implements People { public v ...

  9. vue2.0开发时导入组件时出错

    导入自定义组件时出现了如下错误 ERROR Failed to compile with 1 errors 12:35:41 This dependency was not found: * comp ...

  10. POJ 2125 Destroying The Graph [最小割 打印方案]

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8311   Accepted: 2 ...