Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python数值类型

Python数值类型

作者头像
py3study
发布于 2020-01-21 05:17:20
发布于 2020-01-21 05:17:20
2.3K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

数值类型

python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   类型           示例
---------------------------------------
   整数          1234, -24, 0
   浮点数        1.23, 1., .2, 3.14e-10
   八进制        0o177, 0O177
   十六进制      0x9ff, 0X9ff
   二进制        0b1010, 0B1010

需要说明的几点事项:

  • python 3.x中的整数不区分一般整数和长整型整数,3.x版本中的整数支持无穷精度
  • 任何时候浮点数都是不精确的。当带有小数点或科学计数的标记符号e或E,就表示这是浮点数
    • 当浮点数参与表达式的运算时,会以浮点数的规则进行运算,也就是整数会转换成浮点数类型
    • python中的浮点数精度和C语言的双精度浮点数精度相同
  • 整数除了十进制整数外,还可以写成二进制、八进制、十六进制甚至是其它进制的整数,它们的转换方式见后文
    • 当一个整数以0b0B开头,其后都是0、1时,默认识别为二进制整数
    • 当一个整数以0o0O开头(数值零和大、小写的字母o),其后都是0-7之间的数值时,默认识别为8进制整数
    • 当一个整数以0x0X开始,其后都是[0-9a-fA-F]之间的字符时,默认识别为十六进制

python中的数值类型是不可变对象,不可变意味着不可原处修改。假如a = 3333,那么现在内存中会有一个内存块保存数值对象3333,如果修改它,比如对它加上1操作a += 1,python将创建一个新的内存块用来保存新的数值对象3334,而不是在3333那个内存块中直接修改为3334,所以那个原始的数值3333就被丢弃了,它会等待垃圾回收器去回收。关于可变、不可变对象,后面的文章将会经常提到,请先留意这两个词。

数值基本运算

支持最基本的数学运算符号:+ - * / % **、取正负+x -x,地板除法//,除法和取模divmod(x, y)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 123 + 345
468
>>> 345 - 123
222
>>> 1.5 * 4
6.0
>>> 2/5
0.4
>>> 2 % 3
2
>>> 3 ** 2
9
>>> 3.00 ** 2
9.0
>>> 3 ** 100
515377520732011331036461129765621272702107522001

>>> a = 3; b = -3
>>> -a, -b
(-3, 3)
>>> divmod(5, 2)
(2, 1)

可见,python的数值计算方式非常直接,且python 3.x中会自动为整数提供无穷精度。正如上面最后一个计算表达式(3**100),它将所有数字都显示出来了。就算是计算3**100003**1000000,python也不会报错,不过3的100万次方,显然需要花上一段时间来计算。这和其它编程语言有所区别,例如java中计算Math.pow(3,10000)将返回Infinity,表示无穷大。

又是几个注意事项:

  • python中的除法运算/得到的结果总是浮点数(例如9/3=3.0),后面还有一种地板除法(floor)不一样。
  • 当数值部分有小数时,会自动转换为浮点数类型进行运算,而且会自动忽略参与运算的小数尾部的0
  • 加号+和乘号*也能处理字符串:
    • +可以连接字符串,例如"abc" + "def"得到abcdef
    • *可以重复字符串次数,例如"a"*3得到"aaa""ab"*3得到"ababab"

其它数学运算方法

除了上面的基础算术运算符,还支持很多数值类型的运算符,例如:取反(~)、位移(>>)、位与(&)、位异或(^)、逻辑与(and)、逻辑或(or)

除此之外,还有几个python的内置数学函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pow():求幂,如pow(2,3)=8
abs():求绝对值,如abs(-3)=3
round():四舍五入,如round(3.5)=4
int():取整(截去小数部分),如int(3.5)=3
float():转换成浮点数,如float(3)=3.0
oct():十进制整数转换成八进制
hex():十进制整数转换成十六进制整数
bin():十进制整数转换成二进制
...等等...

还有专门的数学模块math、取随机数的模块random等。

浮点数

由于硬件的原因,使得计算机对于浮点数的处理总是不精确的。

例如,按照数学运算时,1.1-0.9=0.2,但实际得到的结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 1.1-0.9
0.20000000000000007

它以高精度的极限趋近的值来显示。上面的趋近结果大于按照数学运算结果,但并不总是如此,例如下面的运算则是小于数学运算的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 3.3-3.2
0.09999999999999964

由于浮点数不精确,所以尽量不要对两个浮点数数进行等值==和不等值!=比较.如果非要比较,应该通过它们的减法求绝对值,再与一个足够小(不会影响结果)的值做不等比较。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> (3.2-2.8) == 0.4
False

>>> abs((3.2-2.8)-0.4) < 0.0002
True

最后,浮点数并非总是输出很长精度的值。正如前面的运算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 3.2+3.2
6.4
>>> 3/10
0.3

浮点数有两个特殊方法,一个是is_integer(),用来测试这个浮点数是否是整数,另一个是as_integer_ratio(),可以将浮点数转换成分子分母组成的元组,不过这个方法并非总是如你所想的那样友好。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> (3.0).is_integer()
True
>>> (3.2).is_integer()
False

>>> (2.5).as_integer_ratio()
(5, 2)
>>> (2.6).as_integer_ratio()
(5854679515581645, 2251799813685248)

浮点数总是不精确的,而且不能指定小数位数。但在python中,有一个专门的小数模块decimal,它可以提供精确的小数运算,还有一个分数模块fractions,也能提供精确的小数运算。

真除法、Floor除法和小数位截断

  • /:实现的是真除法。在python中,它总是返回浮点数值
  • //:实现的是floor地板除法,它会去掉除法运算后的小数位,以便得到小于运算结果的最大整数。如果参与运算的有小数,则返回浮点数,否则返回整数
  • 在math模块中,有地板函数math.floor()和天花板函数math.ceil()。它们的意义可以根据现实中地板、空气、天花板的高低位置来考虑。地板位于空气之下,地板运算的返回值是比空气小的最大整数,天花板位于空气之上,天花板运算的的返回值是比空气大的最小整数
  • round(x, N)是四舍五入,可以指定四舍五入到哪个小数位
  • math.trunc()是直接截断小数
  • 实际上int()函数自身就是字节截断小数的

看下面的示例。

真除法总是返回浮点数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 9/3
3.0
>>> 10/4
2.5
>>> 10/4.0
2.5
>>> -9/2
-4.5
>>> -9/2.0
-4.5

floor除法返回浮点数还是整数取决于参与运算的数是否包含浮点数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 9 // 3
3
>>> 10 // 4
2
>>> 10 // 4.0
2.0

对于正数的运算结果,floor除法是直接去除小数位的。对于负数结果,它是取比运算结果更小的负整数。。

例如,负数结果的floor除法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> -9 // 3
-3
>>> -10 // 4
-3
>>> -10 // 3
-4

-10 / 4的结果是-2.5,floor要取比它小的最大整数,也就是-3。-10 / 3的结果是-3.3,floor要取比它小的最大整数,也就是-4。

除了真除法和floor除法,还有四舍五入round()和math.trunc()两种截断小数的方式。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> round(10/4)
2
>>> round(-5.2/2)
-3

>>> import math      # import表示导入某个模块
>>> math.trunc(5/2)
2
>>> math.trunc(-5.2/2)
-2

int()也可以直接截断小数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> int(3.6)
3
>>> int(-3.6)
-3

数值类型的转换

  • int()可以将字符串或浮点数转换成整数,也可以用于进制数转换
  • float()可以将字符串或整数转换成浮点数

实际上它们表示根据给定参数在内存中构造一个整数、浮点数对象,所以可以用来作为类型转换工具。而且,前面已经说过,int()可以用来截断小数位。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> int(3.5)   # 浮点数 -> 整数
3
>>> int(-3.6)  # 浮点数 -> 整数
-3
>>> int('3')   # 字符串 -> 整数
3

>>> float(3)   # 整数 -> 浮点数
3.0
>>> float('3') # 字符串 -> 浮点数
3.0

int()还可用于进制数转换,见下文。

小数类型(Decimal)

小数模块decimal,它有一个函数Decimal(),它是精确的,是可以指定小数位数的。

如果没有python基础,这里能看懂多少算多少,反正小数用的也不多。

例如,使用浮点数计算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 0.1 * 3 - 0.3
5.551115123125783e-17

它本该等于0,但结果却是无限接近于0,因为计算机硬件用于存储数值位数的空间有限。

使用decimal模块的Decimal()可以构造精确的小数。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> import decimal
>>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.3')
Decimal('0.0')

注意,Decimal()的参数都是字符串,如果不加引号,它还是会解释成浮点数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

Decimal()的运算的结果会取最长的小数位数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.300')
Decimal('0.000')

可以设置decimal的精度,也就是小数位数。有两种范围的精度:全局范围、局部范围。

例如,没有设置精度时,会保留很多位数的小数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> import decimal
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')

设置全局范围的精度为4,即保留4位小数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> import decimal
>>> decimal.getcontext().prec = 4
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')

全局范围的精度表示整个线程执行时,这个模块的精度都是4。

还可以设置局部范围的精度,局部表示退出了这个范围就失效了。使用with/as语句可以设置局部精度,所以退出with/as语句块精度的设置就失效了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> with decimal.localcontext() as ctx:
...     ctx.prec = 2
...     decimal.Decimal(1) / decimal.Decimal(7)
...
Decimal('0.14')

>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')     # 因为前面设置了全局精度为4

分数(Fraction)

分数模块fractions,它有一个函数Fraction(),它可以构建分数。有了分数之后,可以参与运算。分数和浮点数不同,分数是精确的。

同样地,如果没有python基础,这里能看懂多少算多少,反正用的也不多。

例如,构建分数三分之一。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> import fractions
>>> fractions.Fraction(1,3)
Fraction(1, 3)

还可以根据浮点数的字符串格式构建分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> fractions.Fraction('0.3')
Fraction(3, 10)

然后可以用分数进行运算。

分数加整数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> fractions.Fraction(1,3) + 1
Fraction(4, 3)

分数加、减、乘、除分数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> fractions.Fraction(1,3) + fractions.Fraction(2,3)
Fraction(1, 1)
>>> fractions.Fraction(1,3) - fractions.Fraction(2,3)
Fraction(-1, 3)
>>> fractions.Fraction(1,3) * fractions.Fraction(2,3)
Fraction(2, 9)
>>> fractions.Fraction(1,3) / fractions.Fraction(2,3)
Fraction(1, 2)

实际上,float对象有一个as_integer_ratio()函数,可以将浮点数转换成整数的元组表示形式(元组后面的文章会介绍),然后根据这个元组就可以构造出分数来。

例如,将2.5转换成元组,并进而转换成分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> (2.5).as_integer_ratio()
(5, 2)      # 得到元组

>>> fractions.Fraction(*(2.5).as_integer_ratio())
Fraction(5, 2)

进制整数的转换

  • oct():十进制整数转换成八进制
  • hex():十进制整数转换成十六进制整数
  • bin():十进制整数转换成二进制

例如,将十进制的64转换成二进制、八进制、十六进制整数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> bin(64),oct(64),hex(64)
('0b1000000', '0o100', '0x40')

int()函数也能进行进制转换,它的用法格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int(x, base=10)

base指定要将x解释成哪个进制位的数,然后转换成十进制数,也就是前面说的构造一个整数对象。不指定base时,默认解释成10进制。

base的值可以是0或2-36之间的任意一个数,base=0也表示解释成10进制。

例如,将二进制的数转换为十进制整数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> int('0b11',base=2)
3
>>> int('11',base=2)
3

既然x要解释成某个进制的数,那么超出这个进制的数自然不能出现。例如:

  • 将x解释成二进制数的时候,x里就不能包含除0、1之外的数(当然,前缀0b除外);
  • 解释成7进制,就不能出现7、8、9;
  • 解释成8进制,就不能出现8、9;
  • 解释成11进制,就只能出现0-9、a/A这些字符;
  • 12进制就只能出现0-9、aAbB这几个字符;
  • 36进制就只能出现0-9、a-zA-Z这几个字符。

例如,将一个字符串解释为15进制,并转换成整数。15进制只能出现0-9、a-eA-E这几个字符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> int('93E', base=15)
2084
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python数字类型
在python中,数据采用了对象的形式(无论是python内置对象还是使用python工具和像C语言自行创建的对象)。
py3study
2020/01/13
1.1K0
Python学习笔记(四)——数字
在Python中,数字并不是一个真正的对象类型,而是一组类似类型的分类。Python不仅支持通常的数据类型(整数和浮点数。),而且能够通过常量去直接创建数字以及处理数字的表达式。
py3study
2020/01/15
7300
python第二周 数字类型
Python中,数字并不是一个真正的对象类型,而是一组类似类型的分类。Python不仅支持通常的数字类型(整数和浮点数),而且能够通过常量去直接创建数字以及处理数字的表达式,还通过模块和第三方库提供更多的数字类型支持。Python数字类型的完整工具包括:
py3study
2020/01/15
7970
Python3学习笔记 | 二、Python的类型与运算
二进制数表示方式为0b或者0B开头。例如:0b10110010,0B11001001 八进制数表述方式为0o或者0O开头。例如:0o632765,0O223174 十六进制数表述方式为0x或者0X开头。例如:0xff,0X3A,0xAC,0Xb7
TeamsSix
2019/09/24
1.2K0
Python基础知识(五)--数据类型
#标识符,以字母或下划线开头,不与关键字重复 #不使用系统内置标识符、函数名、异常名 #不使用开头和结尾都是下划线作为自定义标识符名 #以免与系统定义的特殊方法或变量冲突 #当循环不影响实际变量的时候,可以在for..in中使用单个_ for _ in (0, 1, 2, 3, 4, 5): print("Hello") #关键字列表 and continue except global lambda pass
py3study
2020/01/09
7480
python基础之数值类型
此时可以通过导入decimal模块来解决这个问题。首先来介绍一下decimal模块:
py3study
2020/01/19
1.1K0
python基础之数值类型
Python随记(2)数据类型(小数,分数) 分支循环
整形(int) 布尔类型(bool) 浮点型(float,e记法1.5e11=1.5*10的11次方) 字符串(str)类型的获取**type()**函数type('abc') <class 'str'> **isinstance()**函数isinstance('abc',str) >>True 扩展: s 为字符串 s.isalnum() 所有字符都是数字或者字母,为真返回 True,否则返回 False。 s.isalpha() 所有字符都是字母,为真返回 True,否则返回 False。 s.isdigit() 所有字符都是数字,为真返回 True,否则返回 False。 s.islower() 所有字符都是小写,为真返回 True,否则返回 False。 s.isupper() 所有字符都是大写,为真返回 True,否则返回 False。 s.istitle() 所有单词都是首字母大写,为真返回 True,否则返回 False。 s.isspace() 所有字符都是空白字符,为真返回 True,否则返回 False常用操作符:x%y 求x除以y的余数; x//y 地板除取小的整数(3//2==1); abs(x)绝对值; dirmod(x,y)=(x//y,x%y); pow(x,y)x的y次方; complex(re,im)复数(实部,虚部); a=a+1 可化简为 a += 1 c = c*5 c *=5优先级:幂运算 >:正负号>算术操作符>比较操作符>逻辑运算符(not>and>or) not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 ==4 ;(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)=0 or 0 or 4 or 6 or 9= 4
用户7886150
2020/12/22
8020
【编程课堂】震惊!小 bug 引发大灾难,0.1 + 0.2 的结果竟然是……
各位观众点进标题看文章的时候,我已经准备打包行李去UC报道啦~ 冷笑话结束,嗯,说正事。 请大家思考一下在 python 控制台输入 0.1 + 0.2 == 0.3 ,返回的结果是什么? 手边有电脑的同学可以立即在 python 控制台下尝试一下,对浮点数精度不够了解的同学可能会大呼:天啦噜,夭寿啦,怎么会是 False ! 没错 ,不管是在 Python,还是 C++、Java、JavaScript 等其他语言中,都是 False。 为什么会出现这样的结果?首先我们要了解,在计算机的存储类型为二进制,
Crossin先生
2018/04/17
9660
入门篇:Python里的数
整数,令人惊叹于它的简单。两个整数相除,例如4/3,得到一个浮点数,并且(4/3)*3的结果也是浮点数4.0。即便你没有定义浮点数,在进行除法运算的时候,它会自动出现。
老齐
2020/05/15
7890
入门篇:Python里的数
[PYTHON] 核心编程笔记之五-Py
变量像一个指针指向装变量值的盒子,对不可变类型来说,你无法改变盒子内容,但可以将指针指向一个新盒子,每次将另外的数字赋给变量时,实际上是创建了一个新的对象并把它赋给变量
py3study
2020/01/09
6450
【Python】:老鸟的入门笔记(2)
哈喽,大家好!相信有很多在传统软件行业的小伙伴,日常接触JS、Java、C#这类语言多一些,很少用到Python。但是Python确实很香(例如:AI、数学、绘图等),早晚会碰上它。对于我们这些懂编程但不懂Python的“老新手”来说,只有系统、全面地科普一下Python基础知识,才能更好、更高效地搬运的代码。下面是我整理的一些Python3笔记,分享给大家。
WEBJ2EE
2023/09/02
2080
【Python】:老鸟的入门笔记(2)
python笔记一 入门py
id()函数,是python内置函数,查看每一个对象的地址。 >>> help(id); Help on built-in function id in module builtins: id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint:
热心的社会主义接班人
2018/04/27
7740
0.1 + 0.2 不等于 0.3?原来是因为这个
浮点数精度丢失,一直是前端面试八股文里很常见的一个问题,今天我们就来深入的了解一下问题背后的原理,以及给一些日常处理的小技巧。
沐洒
2023/07/05
6740
0.1 + 0.2 不等于 0.3?原来是因为这个
【使用Python实现算法】03 标准库(数字与数学模块)
作为 LeetCode Python 环境中默认导入的标准库模块之一,math模块提供了很多非常有用的数字和数学方面的函数。
杜逸先
2023/04/13
5630
为什么0.1 + 0.2 不等于 0.3 ?
在很多编程语言中,我们都会发现一个奇怪的现象,就是计算 0.1 + 0.2,它得到的结果并不是 0.3,比如 C、C++、JavaScript 、Python、Java、Ruby 等,都会有这个问题。
奥耶可乐冰
2024/05/30
2700
为什么0.1 + 0.2 不等于 0.3 ?
浅谈Python内置对象类型——数字篇(附py2和py3的区别之一)
Python是一门面向对象的编程设计语言,程序中每一样东西都可以视为一个对象。Python内置对象可以分为简单类型和容器类型,简单类型主要是数值型数据,而容器类型是可以包含其他对象类型的集体,如序列、元组、映射等。
Python进阶者
2021/08/24
1.1K0
Python 中有关数字必知的三件事
如果用 Python 写过代码,肯定遇到了数字,比如整数作为列表的索引,用浮点数表示当前财富的数量,等等。
老齐
2022/01/27
3610
Python——数值类型
python的数值类型包括整数,浮点数,复数,集合,小数和分数,布尔值。它们都是python中的数值类型。如果是有过其他语言编写经验的人,一定很好奇,浮点数和小数的区别是什么?
zy010101
2021/06/09
1.2K0
Python数据类型 -数值类型(整数,
Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。
py3study
2020/01/09
1.4K0
Python 基础(十九):数学相关模块
返回 x 的阶乘,如果 x 不是整数或为负数时则将引发 ValueError。看下示例:
Python小二
2020/08/18
4700
相关推荐
python数字类型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验