python基本数据类型之数字与浮点型

在python3中,整数的数据类型为int,而浮点数的数据类型为float。python2中整数可以是int和long(长整型)两种类型,python3只保留了int,去除了long。

整型

int也属于不可变类型,即int类型的变量一旦在内存中被创建就无法改变。int类型本身的内置方法并不多,仅有4个方法:bit_length()、conjugate、from_bytes、to_bytes。

1、bit_length()

该方法是获取某个数字二进制形式的位数。

i = 5
v = i.bit_length()
print(bin(i))
print(v)

打印结果:

0b101
3

可以看到,5被转换成二进制就是101,该数字的二进制形式有3位。

2、conjugate

该方法是用来操作复数的。在python中,复数的表示方法为:real(实部) + image j(虚部)。实部和虚部都可以是浮点类型(float),虚部的后缀可以是j或J。conjugate方法可以返回复数的共轭复数。

i = (12 + 3.4j)
v = i.conjugate()
print(v)

打印结果:(12-3.4j)

注意,在定义复数的时候,尽量带上小括号,这样可以更加明确变量之间的关系。

3、from_bytes、to_bytes

from_bytes是将bytes类型的变量转化为十进制的数字。该函数是一个类函数(可以用类名直接调用的函数)。from_bytes一共有4个参数,其中一个参数是保留参数。

int.from_bytes(bytes, byteorder, *, signed=False)

  • bytes 字节类型的变量
  • bytesorder 字节类型变量的排序方式,'big'表示高位在前,低位在后;'little'表示低位在前,高位在后。
  • signed 是否考虑符号位,默认为False,即不考虑符号位

例如:

s1 = b'\xff\xf1'
print(int.from_bytes(s1, byteorder='big', signed=True))

打印结果: 15

分析该方法的作用过程:

  1. 首先声明了一个bytes类型的变量s:s1 = b'\xff\xf1',在引号前加上b表示该变量是bytes类型,\x表示后面两位是十六进制数字。

  2. \xff 写成二进制数字:1111 1111,\xf1 则写成:1111 0001,由于高低位标识为'big',即ff为高位,f1为低位,(如果是'little',则ff是低位,f1是高位),所以整个数字的二进制形式为:11111111 11110001。

  3. 又因为signed=True,所以要考虑符号位。因为该数字的第一位是1,因此它是一个负数。十进制要用补码来表示,而负数的补码就是原码(除符号位外)取反加1。因此取反加1后的结果为:10000000 00001111。因此表示成十进制就是 -15

另外一个例子:

s1 = b'\xff\xf1'
print(int.from_bytes(s1, byteorder='little', signed=False))

打印结果:61951

在这个例子中,byteorder='little',表示ff是低位,f1是高位,则整个二进制数写作:11110001 11111111;signed=False表示不考虑符号位。因此表示为正数,结果就是61951。

to_bytes表示将某个数转换为十六进制表示,是from_bytes函数的逆过程。

print(int.to_bytes(61951, length=2, byteorder='little', signed=False))

打印结果:b'\xff\xf1'

to_bytes函数的参数与from_bytes的参数意义基本一致,其中length=2指定转换后的bytes类型用2位来表示,即\xff、\xf1两位。

浮点类型

python中的浮点数类型为float,其中包含的方法有:as_integer_ratio、conjugate、fromhex、hex、is_integer

conjugate的用法与int中的内置方法一样,因此不再赘述。

1、as_integer_ratio

该方法可以将某一个浮点数表示成两个整型(最小整数)之比的形式。

例如:

t = 10.5
print(t.as_integer_ratio())

打印结果:(21, 2)

该方法其实是将浮点数转换成分数形式,当遇到负数时,该方法会保证分母为正。

t = -0.25
print(t.as_integer_ratio())

打印结果:(-1, 4)

该方法寻找的是最精确的整数之比,所以当输入的小数特别复杂时,寻找到的最小整数也就越大。

t = -0.99
print(t.as_integer_ratio())

打印结果:(-4458563631096791, 4503599627370496)

当寻找的最精确比值中的整数超出int类型最大值时,会产生内存溢出的错误。

2、fromhex、hex

fromhex方法是将一个十六进制用十进制进行表示。

f1 = '0x1.fp1'
print(float.fromhex(f1))

打印结果:3.875

0x1.fp1中的符号表示意义如下:

  • 0x 表示该数字是一个十六进制数字
  • 1.f 这个是数字部分
  • p1 科学计数法,p1的意思是2^1, 即2的1次方。

该函数的转换过程是:

  1. 1.f转换成二进制表示为:1.1111;
  2. 1.fp1表示的是1.111 * 2^1, 也就是将小数点右移一位,该数字表示为二进制:11.111。
  3. 将11.111转换成十进制。乘以2^(n-1)次方, 1*2^1 + 1*2^0 + 1*2^(-1) + 1*2^(-2) + 1*2^(-3) = 2 + 1 + 0.5 + 0.25 + 0.125 = 3.875。

而hex则是fromhex的逆过程,即将十进制数字转换成八进制表示。该过程同样也需要二进制作为中介。

f2 = 7.875
print(float.hex(f2))

打印结果:0x1.f800000000000p+2

该函数的过程如下:

  1. 将十进制数字拆分为整数部分和小数部分。7.875分为7 + 0.875
  2. 对于整数部分,让其除以2,不断取余,并逆序取值。
    • 7 / 2 = 3...1(余1)
    • 3 / 2 = 1...1
    • 由最后得到的1往上取,即7 = 111b
  3. 对于小数部分,使其不断乘以2,取其整数部分,并顺序取值。
    • 0.875 * 2 = 1.75(取1)
    • 0.75 * 2 = 1.5(取1)
    • 0.5 * 2 = 1
    • 由第一个得到的1向下取,即0.875 = 0.111b
  4. 所以7.875转换成二进制为:111.111,使用科学计数法表示为:1.11111p2
  5. 将1.11111补齐:1.1111 1000,四位一取,即1.f8

所以7.875(10)转换成八进制:1.f8p2。

3、is_integer

该方法用来判断一个浮点数是否是整数,即能否精确转换成整数(小数部分是否全为0)。

i = 3.00
v1 = i.is_integer()
print('v1 = '+ str(v1)) i2 = 4.12
v2 = i2.is_integer()
print('v2 = '+ str(v2))

打印结果:

v1 = True
v2 = False

可以看到,当小数部分不全为0时,该方法返回的就是False。

python基本数据类型之整型和浮点型的更多相关文章

  1. 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型

    Swift 2.0学习笔记(Day 13)——数据类型之整型和浮点型 原创文章,欢迎转载.转载请注明:关东升的博客    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循 ...

  2. Swift数据类型_整型和浮点型

    //swift中的整型和浮点型 /** * //类型推断整数是Int 浮点数是Double ,日常使用需要注意不能越界,存储时间毫秒数 英雄经验数等等之类内容容易越界 整型 大多数情况下,你不需要在代 ...

  3. Python基本数据类型之整型和布尔型

    整型和布尔型 获取对象的数据类型 1.type() 2.dir() 3.help() 4.在pycharm里面的操作 数字类型 int 创建: int() 接收数字字符串 .bit_lenght() ...

  4. Swift数据类型之整型和浮点型-备

    Swift提供8.16.32.64位形式的有符号及无符号整数.这些整数类型遵循C语言的命名规约,我归纳了Swift中的整型: 整型示例: print("UInt8 range: \(UInt ...

  5. go语言数据类型值--整型和浮点型

    一.整型 1.整型的分类: 有符号整型: int8.int16.int32.int64 对应的无符号整型: uint8.uint16.uint32.uint64 uint就是我们熟知的byte类型,i ...

  6. 整型和浮点型与QByteArray的转换

    目录 QByteArray 整型 QByteArray 浮点型 QByteArray QByteArray The QByteArray class provides an array of byte ...

  7. 以php中的比较运算符操作整型,浮点型,字符串型,布尔型和空类型

    字符,数字,特殊符号的比较依赖ASC II表,本表原先有127个,后来又扩充了一些,里面包含了奇奇奇怪的符号. ASC II表 https://baike.baidu.com/item/ASCII/3 ...

  8. 课时5:闲聊之Python的数据类型

    目录: 一.引言 二.数据类型 >整型 >浮点型 >布尔类型 三.类型转换 四.获得关于类型的信息 五.课时05课后习题及答案 *********** 一.引言 ********** ...

  9. python基本数据类型常用方法

    python基本数据类型 1.整型 1.1 int 1.2 bit_lenght # 当前数字的二进制位数,至少用n位表示 r = age.bit_length() >>> a = ...

随机推荐

  1. Percona MySQL 5.7 Linux通用二进制包安装(CentOS 6)

    Linux 安装 Percona http://blog.itpub.net/26506993/viewspace-2136501/ https://www.cnblogs.com/snowwhite ...

  2. java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么? Java虚拟机主要分为以下一个区: 方法区:1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区 ...

  3. jdk 8 日期处理。

    ZoneId id = ZoneId.systemDefault(); LocalDateTime dateTime = LocalDateTime.now(id); System.out.print ...

  4. hadoop 二次排序的思考

    name sorce jx 10 gj 15 jx 20 gj 30 1. 二次排序 key如何定义 2. grouping 是不是一定要实现,不实现可以吗? 3. 二次排序的本质是什么 4. 如果以 ...

  5. CPU与内存互联的架构演变

    随着计算机中CPU核数目的增加,传统的UMA(unifonn memory access)架构由于对关键硬件(如中央内存控制器)的竞争加剧出现了性能上的瓶颈,即扩展性不强.而NUMA架构则以其良好的可 ...

  6. pytho学习笔记---编码

    编解码 ASCII:1字节,0-255 GBK2313:常用的汉字,2万多个 GBK:对GBK2313的补充,支持藏文,2个字节表示一个汉字 big5:台湾,繁体字 unicode:万国码,2-4字节 ...

  7. Fiddler 抓包工具怎么使用?怎么在Android手机端的APP抓包

    https://blog.csdn.net/loner_fang/article/details/83309266 参考这个人的微博上有fiddler主要功能使用的步骤. 序章 Fiddler是一个蛮 ...

  8. 27.Hibernate-缓存和懒加载.md

    目录 1.一级缓存 2.缓存的有效性 3.list和iterator缓存的区别 4.懒加载 4.1get 4.2load 1.一级缓存 Hibernate中一级缓存是Session缓存,有效范围在Se ...

  9. JAVA条件判断

    一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表达式为true,执行{ ...

  10. 2018面向对象程序设计(Java)第18周学习指导及要求

    2018面向对象程序设计(Java) 第18周学习指导及要求(2018.12.27-2018.12.30)   学习目标 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设 ...