python中的进制转换

本文介绍了Python中不同进制间的转换,包括使用bin()、oct()、hex()函数进行十进制与二进制、八进制、十六进制之间的转换。同时,文章探讨了浮点数转换时可能出现的精度误差问题,并提到了decimal模块在处理高精度计算时的作用。
部署运行你感兴趣的模型镜像

Python 中的进制转换

转换函数
在 Python 内置函数中提供了实现数值转换的函数,下面依次介绍。

  1. 十进制转换为二进制

内置函数 bin() 能将十进制的整数转换为二进制,例如:

>>> bin(2)
'0b10'
>>> bin(255)
'0b11111111'
>>> bin(-3)
'-0b11'

bin() 只能对十进制的整数进行转换,所返回值是用字符串(参阅第4章4.2节)表示的二进制数字(简称“二进制字符串”),如图3-4-1所示,其中 0b 是二进制字符串前缀。
在这里插入图片描述

若将十进制的浮点数转化为二进制,是否可以用 bin()?不能!官方文档中很明确地指出:Convert an integer number to a binary string prefixed with “0b”.(https://docs.python.org/3/library/functions.html#bin),还可以试试:

2. 十进制转换为八进制

内置函数 oct() 可以将整数转化为以 0o 为前缀的八进制字符串,如:

>>> oct(8)
'0o10'
>>> oct(256)
'0o400'
注意参数依然必须是整数。

3. 十进制转换为十六进制

内置函数 hex() 可以将整数转化为以 0x 为前缀的十六进制字符串,如:

>>> hex(16)
'0x10'
>>> hex(255)
'0xff'

在十六进制中,一般用数字 到 和字母 到 表示。在 hex() 返回的十六进制字符串中,所用的 到 的字母均为小写。

对于十进制的浮点数,虽然 hexo() 不能使用,但浮点数对象有一个方法可以实现向十六进制的转换。

>>> float.hex(0.1)
'0x1.999999999999ap-4'
>>> 0.1.hex()
'0x1.999999999999ap-4'

其实,这里得到的十六进制字符串与十进制浮点数 0.1 并非严格相等。

4. 二进制转换为十进制

如果在交互模式中直接输入二进制数,比如 01,Python 解释器并不接受——所接受的是十进制数。

01
File “”, line 1
01
^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
当然,有的读者可能输入的是 11 ,不会报错,但 Python 把它看做二进制 11 了吗?没有!它显然被 Python 认定为十进制的整数十一了。

>>> 11
11
>>> type(11)
<class 'int'>

但是,如果在交互模式中这样输入二进制数字:

>>> 0b11
3
>>> 0b10
2
>>> 0b11111111
255

注意,输入的不是“二进制字符串”,而是在二进制数前面写上了前缀 0b,表示当前所输入的是二进制数,返回值则是对应的十进制整数。这种方式仅限于交互模式,在程序文件中不能这样做——千万不要将 >>> 0b11 复制到 .py 文件中。

更常用的方法是使用内置函数 int()

>>> int('0b10', 2)
2
>>> int('11111111', 2)
255

其中的’0b10’ 和 ‘11111111’ 都是二进制字符串,并且要设置参数 base=2 ,即说明参数中的数字是二进制数字——不明确“告诉” Python ,它不知道 ‘0b10’ 和 ‘11111111’ 表示的是二进制字符串。

同样用 int() 函数,也能将八进制、十六进制的整数转换为十进制的整数。

>>> int('0xff', base=16)
255
>>> int('0o10', base=8)
8

5.四舍五入函数round()

>>> round(2.675, 2)
2.67

“This is not a bug”。那是什么呢?

类似的现象,其实还有,比如:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
>>> 0.1 + 0.1 + 0.1 - 0.2
0.10000000000000003

这些计算中都有一些“误差”,也不是 Python 的 bug。

由于计算机是执行二进制计算的,要完成十进制数字的计算,不得不将十进制数字转化为二进制。对于十进制的整数而言,都有精确的二进制数对应。但是,对于浮点数就不完全有精确的二进制数对应了。

例如, 转化为二进制是: 。这个二进制数不精确等于十进制数 。同时,计算机存储的位数是有限制的,所以,就出现了上述“误差”。

这种问题不仅在 Python 中会遇到,在所有支持浮点数运算的编程语言中都会遇到,所以它不是 Python 的 bug 。

明白了原因后,该怎么解决呢?就 Python 的浮点数运算而言,大多数计算机每次计算误差不超过 。对于大多数任务来说,通过“四舍五入”即能得到
但是,如果遇到“较真”的要求,怎么办?

>>> import decimal
>>> a = decimal.Decimal('0.1')
>>> b = decimal.Decimal('0.2')
>>> a + b
Decimal('0.3')
>>> float(a + b)
0.3

decimal 是 Python 标准库的一个模块,官方地址是 https://docs.python.org/3/library/decimal.html 。如上述代码示例,分别创建了与浮点数 和 对应的两个对象( decimal.Decimal 类型),它们之间相加,所得结果即为准确的 。但是这样计算的速度要低于浮点数运算。

decimal 模块不仅能解决上述计算“误差”问题,还有很多用途,比如某个业务要求所有计算结果必须有 位有效数字(注意与“四舍五入”不同),可以这样实现:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 3
>>> Decimal(1) / Decimal(7)
Decimal('0.143')
>>> Decimal(3) * Decimal(math.pi) ** 2
Decimal('29.6')

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值