>>> 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. 利用vanitygen生成比特币个性地址的教程

      比特币怎么生成地址?大家都知道比特币地址都是以1开头的一串乱码,很多朋友会新建过一排地址然后在里面挑选,下面小编为大家分享下比特币生成个性地址方法. 其实就是使用vanitygen软件来生成个性化 ...

  2. eclipse:Workspace in use or cannot be created

    打开eclipse出现:Workspace in use or cannot be created, choose a different one 原因:出现这种情况一般是workspace的配置文件 ...

  3. 【转】 要做linux运维工程师的朋友,必须要掌握以下几个工具才行

          本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入 ...

  4. 自动化安装DHCP配置脚本

    DHCP配置脚本: #!/bin/sh NET=192.168.6.0 MASK=255.255.255.0 RANGE="192.168.6.50 192.168.6.100" ...

  5. oracle光标的使用

    以下plsql程序用的scott用户的dept,emp表. 1.光标的使用: --查询并打印员工的姓名名和薪水 /* 光标属性: %found %notfound */ set serveroutpu ...

  6. c# 程序结构

    最近工作中需要用到c#,所以从今天开始博客不定期更新c#学习笔记 c#程序结构大体分为, 命名空间 类 Main 方法   命名空间 相当于一个仓库 通过 using 引入命名空间 比如 using ...

  7. OS模块的常用内置方法

    chdir 修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod 修改一个文件的访问权限 Ch ...

  8. 使用react-router实现单页面应用路由

    这是Webpack+React系列配置过程记录的第二篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  9. bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]

    4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...

  10. BZOJ 3990: [SDOI2015]排序 [搜索]

    3990: [SDOI2015]排序 题意:\(2^n\)的一个排列,给你n种操作,第i种把每\(2^{i-1}\)个数看成一段,交换任意两段.问是这个序列有序的操作方案数,两个操作序列不同,当且仅当 ...