master
/ 2.1 数值类型.ipynb

2.1 数值类型.ipynb @masterview markup · raw · history · blame

Notebook

数值类型

Python 3 中可参与数学运算的数值类型主要有三种:

  1. __整数__(int)
  2. __浮点数__(float)
  3. __复数__(complex)

2.1.1 整数

__整数__是不带小数点的数字,包括0、正整数和负整数。整数的4种进制表示如表2.1所示。 例如:123、-45、0b1101(二进制)、0o17(八进制)、0xff(十六进制)。</font>

进制种类 引导符号 描述与示例
十进制 由字符0到9组成,遇10进1,如:99, 156
二进制 0b或0B 由字符0和1组成,遇2进1,如:0b1010,0B1111
八进制 0o或0O 由字符0到7组成,遇8进1,如:0o107,0O777
十六进制 0x或0X 由字符0到9及a、b、c、d、e、f或A、B、C、D、E、F组成,遇16进1,如0xFF,0X10A
In [ ]:
# 十进制整数
0,123,-45
In [ ]:
# 二进制整数
0b1101,0B1100
In [ ]:
# 八进制整数
0o17,0O777
In [ ]:
# 十六进制整数
0xff,0X123456789ABCDEF

一般来说,Python 3 中__整数__几乎是__没有限制大小的__,可以存储计算机内存能够容纳的无限大整数,而且整数永远是精确的。</font>

In [ ]:
import math  # 导入 math 库
print(math.factorial(100)) # 计算100的阶乘,158位整数

练一练

In [ ]:
# 试着仿照上面的例子,试着在下面写代码求解1000的阶乘,看看是否能正确显示

除了通常意义上的整数以外,__布尔值__(bool)属于整数的__子类型__。布尔值是两个常量对象__False____True__。 它们被用来表示逻辑上的__真值____假值__。在数字类的上下文中,例如被用作算术运算符的参数时,它们的行为分别类似于__整数 0 和 1__ 。 </font>

In [ ]:
False + 2
In [ ]:
True * 2 + 3

__内置函数 bool()__可被用来将任意值转换为布尔值,只要该值可被解析为一个逻辑值。</font> 包括负数和正数)都会被转换为 True

In [ ]:
print(bool(3+4))
print(bool(3-9))
In [ ]:
bool(10-5*2)

2.1.2 浮点数

浮点数有两种表示方法:

  • 十进制表示

十进制表示的__浮点数__由整数部分与小数部分组成,其小数部分可以没有值,但__小数点__必须要有,此时相当于小数部分为0。</font>

In [ ]:
123.45,23.0,0.78,12.,.15

print(.15*10)      ## .15 代表的是 0.15
print(float(3))    ##  必须有小数点  输出为 3.0

import decimal
b = decimal.Decimal(pow(10.0,23))   

print(b)


b = decimal.Decimal(pow(10.0,22))

print(b)

b
  • 科学计数法

科学计数法表示为<x>e<n>,等价于数学中的$x \times\ 10^n $。

In [ ]:
0.48e-5,2e3,2.53e3

计算机中数字的表示采用的是二进制的方式,十进制与二进制转换过程中可能会引入误差,所以一般来说,__浮点数无法保证百分之百的精确__。</font>

In [ ]:
print(43.02 * 7)  # 预期输出:301.14 

print(0.1 + 0.2)

## C语言也会出现这样的情况
# #include <stdio.h>

# int main() {
#     double result = 0.1 + 0.2;
#     printf("%.17f\n", result);  // 输出: 0.30000000000000004
#     return 0;
# }
In [ ]:
5.02 / 0.1  # 预期输出:50.20

Python 3对于浮点数默认提供__大约17位数字的精度__。占8 个字节(64位)内存空间,其数字范围为$1.7× 10^{-308} ~1.7× 10^{308}$。</font>

In [ ]:
pow(809.0, 106)  # 输出809的106次幂的值
In [ ]:
pow(810.0, 106)  # 输出810的106次幂的值,引发OverflowError

系统会将输入的浮点数只保留__17位有效数字__,其余的截断__丢弃__,所以在计算机中浮点数经常__无法精确表示__。</font>

In [ ]:
a = 3.1415926535897932384626433832795
b = 314159.26535897932384626433832795
c = 31415926535897.932384626433832795
print(a, b, c, sep='\n')

Python默认的是17位有效数字的精度,当计算需要使用更高的精度(超过17位小数)的时候,可以使用以下方法进行处理:

In [ ]:
print('{:.30f}'.format(314159.265358979323846264338327950288419716939937510))
print('{:.30f}'.format(3.14159265358979323846264338327950288419716939937510))

输出值:
314159.265358979348093271255493164062
3.141592653589793115997963468544
实际值:
3.14159265358979323846264338327950288419716939937510
结果表明虽然可以显示指定位数的小数部分,但是结果并不准确,超过16位有效数字后面的数字往往没有精确意义了。

2.1.3 复数

__复数__( (complex))由__实数__部分和__虚数__部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点数。 可以用__real____imag__分别获取复数的实部和虚部,用abs(a+bj)获得复数的模。 模=√(实部)²+(虚部)²

In [14]:
print((3.0 + 4.0j).real)
print((3.0 + 4.0j).imag)
print(abs(3.0 + 4.0j))
3.0
4.0
5.0
In [ ]:
a = 3
b = 2
c = 6
# 3*x**2 + 2*x + 6 = 0
# 计算根
delta = b ** 2 - 4 * a * c
root1 = (-b + delta**0.5) / (2 * a)
root2 = (-b - delta**0.5) / (2 * a)

# 输出结果
print(f"方程的根为:{root1}")  # 方程的根为:(-0.33333333333333326+1.3743685418725535j)
print(f"方程的根为:{root2}")  # 方程的根为:(-0.3333333333333334-1.3743685418725535j)

# 获取实部和虚拟并分别保留2位小数,格式化输出
print("根1 = {:.2f} + {:.2f}j".format(root1.real, root1.imag))
print("根2 = {:.2f} + {:.2f}j".format(root2.real, root2.imag))
In [ ]:
 
In [ ]: