Skip to content

Python 数字类型 ​

在日常生活中,经常会用到数字,例如:商品数量、考试成绩、账户余额和运行时间都需要用数字表示。

计算一笔订单需要知道商品单价和购买数量:

python
price = 12.5
quantity = 4
total = price * quantity

print("订单金额:", total)

运行结果:

text
订单金额: 50.0

这段代码中,quantity 保存整数,price 和 total 保存小数。它们对应 Python 中最常用的两种数字类型:int 和 float。

数字类型与类型转换 ​

常见数字形态与对应数据类型

int 与 float ​

int:整数

int 是 integer 的缩写,表示没有小数部分的整数。

python
student_count = 45
temperature = -3
zero = 0

print(type(student_count))
print(type(temperature))
print(type(zero))

运行结果:

text
<class 'int'>
<class 'int'>
<class 'int'>

type() 用于查看数据类型。正整数、负整数和 0 都属于 int。

Python 的整数没有固定的位数限制,只要计算机内存允许,就可以表示很大的整数。

float:浮点数

float 表示带小数的数字,也叫浮点数。

python
price = 12.5
height = 1.75
temperature = -3.0

print(type(price))
print(type(height))
print(type(temperature))

运行结果:

text
<class 'float'>
<class 'float'>
<class 'float'>

即使小数部分是 0,3.0 仍然是 float,不是 int。

类型由写法和值决定

变量名不会决定数据类型。下面两个变量虽然名字不同,但保存的值都是整数:

python
age = 18
price = 20

print(type(age))
print(type(price))

程序接收到的数据不一定正好是需要的类型。Python 可以使用 int() 和 float() 主动转换。

int() 与 float() ​

转换为整数

python
number = int("18")
price = int(12.9)

print(number)
print(price)
print(type(number))

运行结果:

text
18
12
<class 'int'>

int(12.9) 会直接去掉小数部分,结果是 12,它不是四舍五入。对于负数,转换同样是向 0 的方向截断:

python
print(int(-12.9))

运行结果:

text
-12

转换为浮点数

python
score = float("95.5")
quantity = float(3)

print(score)
print(quantity)
print(type(score))

运行结果:

text
95.5
3.0
<class 'float'>

input() 数据转换 ​

上一节学过,input() 得到的内容都是字符串。要参与数字计算,需要先转换类型。

python
quantity_text = input("请输入购买数量:")
quantity = int(quantity_text)

print("购买数量:", quantity)
print("数据类型:", type(quantity))

也可以把输入和转换写在一起:

python
quantity = int(input("请输入购买数量:"))
price = float(input("请输入商品单价:"))

print("商品总价:", quantity * price)

输入内容必须能够转换

int("18") 可以成功,但 int("18.5") 和 int("十八") 都会出现 ValueError。

如果需要把小数字符串转换成整数,可以分两步转换:

python
number = int(float("18.5"))
print(number)

结果是 18。异常处理会在后面的课程中专门讲解。

数字类型转换规则与 input 处理

数字运算 ​

算术运算符 ​

整数和浮点数可以进行加、减、乘、除等计算。

运算符作用示例结果
+加法10 + 2030
-减法10 - 20-10
*乘法10 * 20200
/除法10 / 200.5
//向下取整除法9 // 24
%取余数9 % 21
**幂运算2 ** 38

下面的代码可以直接观察每种运算的结果:

python
number_a = 9
number_b = 2

print("加法:", number_a + number_b)
print("减法:", number_a - number_b)
print("乘法:", number_a * number_b)
print("除法:", number_a / number_b)
print("取整除:", number_a // number_b)
print("取余数:", number_a % number_b)
print("幂运算:", number_a ** number_b)

除法、整除与取余 ​

这三个运算符都和除法有关,但得到的内容不同:

python
print(9 / 2)
print(9 // 2)
print(9 % 2)

运行结果:

text
4.5
4
1
  • / 得到普通除法结果,并且结果是 float
  • // 得到向下取整后的商
  • % 得到除法的余数

除法、整除与取余的结果对比

“向下取整”在负数计算中尤其重要:

python
print(-9 // 2)

结果是 -5,不是 -4。

除数不能是 0

10 / 0、10 // 0 和 10 % 0 都会出现 ZeroDivisionError。

混合运算与浮点误差 ​

整数和浮点数可以直接参与同一次计算。结果通常会变成 float:

python
quantity = 3
price = 9.9
total = quantity * price

print(total)
print(type(total))

运行结果:

text
29.700000000000003
<class 'float'>

这里出现了一串额外的小数,不是代码写错了。

计算机使用二进制保存浮点数,很多十进制小数无法被精确表示,所以计算结果有时会出现很小的误差。

python
result = 0.1 + 0.2

print(result)
print(round(result, 2))

运行结果:

text
0.30000000000000004
0.3

浮点数表示误差和 round

这是浮点数的正常特性,不是 Python 算错了。当前阶段需要记住:

  • 浮点数计算可能存在很小的误差
  • 展示结果时可以根据需要使用 round()
  • 对金额等必须精确计算的数据,需要使用专门方案

round() 不是所有精度问题的解决方案

round() 主要用于按指定小数位返回舍入结果。它不能把浮点数变成完全精确的十进制数,部分边界值的结果也可能和直觉不同。

运算符还可以处理其他类型

部分运算符也可以处理字符串等数据。例如,上一节使用的 "-" * 20 会生成 20 个短横线。不同数据类型支持的运算不同,后面的字符串和运算符章节会继续讲解。

运算优先级 ​

Python 的基础算术运算顺序和数学中基本一致:

  1. 先计算括号 () 中的内容
  2. 再计算幂 **
  3. 再计算乘、除、取整除和取余:*、/、//、%
  4. 最后计算加减:+、-
python
print(2 + 3 * 5)
print((2 + 3) * 5)
print(2 * 3 + 5)
print(2 * (3 + 5))

运行结果:

text
17
25
11
16

Python 算术运算优先级

同一优先级通常从左向右计算,但幂运算 ** 是从右向左结合。遇到复杂表达式时,不要只靠记忆,使用括号明确计算顺序。

案例:订单金额计算 ​

现在完成开头的订单计算。需求如下:

  1. 输入商品单价
  2. 输入购买数量
  3. 输入优惠金额
  4. 计算并输出应付金额
python
# 接收订单数据并转换类型
price = float(input("请输入商品单价:"))
quantity = int(input("请输入购买数量:"))
discount = float(input("请输入优惠金额:"))

# 先计算商品总价,再减去优惠金额
goods_total = price * quantity
pay_amount = goods_total - discount

print("商品总价:", goods_total)
print("优惠金额:", discount)
print("应付金额:", round(pay_amount, 2))

一次运行结果可能是:

text
请输入商品单价:12.5
请输入购买数量:4
请输入优惠金额:5
商品总价: 50.0
优惠金额: 5.0
应付金额: 45.0

round(pay_amount, 2) 表示按小数点后两位进行舍入。它适合当前练习中的结果展示,但不会自动补齐末尾的 0;专业财务系统通常也不会直接使用 float 处理精确金额。

案例:三位数拆分与水仙花数验证 ​

水仙花数是一个三位数,它每一位数字的三次幂之和等于它本身。例如:

text
153 = 1 ** 3 + 5 ** 3 + 3 ** 3

现在验证 371 是否符合这个规则。

第一步:拆出个位

一个数字除以 10 的余数就是个位:

python
number = 371
ones = number % 10

print("个位:", ones)

第二步:拆出十位和百位

先使用 // 去掉右侧数字,再使用 % 取出目标位置:

python
number = 371

ones = number % 10
tens = number // 10 % 10
hundreds = number // 100

print("百位:", hundreds)
print("十位:", tens)
print("个位:", ones)

运行结果:

text
百位: 3
十位: 7
个位: 1

第三步:计算三次幂之和

python
number = 371

ones = number % 10
tens = number // 10 % 10
hundreds = number // 100
digit_cube_sum = hundreds ** 3 + tens ** 3 + ones ** 3

print("原数字:", number)
print("三次幂之和:", digit_cube_sum)
print("是否相等:", number == digit_cube_sum)

运行结果:

text
原数字: 371
三次幂之和: 371
是否相等: True

三位数拆分与水仙花数验证

== 用于比较两个值是否相等,结果 True 表示条件成立。布尔值和比较运算符会在后面的章节中详细讲解,这里先用它完成验证。

幂运算使用 **

数学中常写成 3³,但 Python 使用 3 ** 3 表示三次幂。^ 在 Python 中不是幂运算符。

动手练习 ​

练习一:计算长方形面积

输入长方形的长和宽,计算并输出面积。长和宽允许输入小数。

练习二:拆分三位数

把 583 的百位、十位和个位分别保存到变量中,再输出结果。

预期结果:

text
百位: 5
十位: 8
个位: 3

练习三:修改水仙花数

把案例中的 371 分别改成 153 和 123,观察最后输出的 True 或 False。

小结 ​

本节课最核心的是掌握 5 件事:

  1. int 表示整数,float 表示浮点数
  2. int() 和 float() 可以转换数据类型
  3. input() 的结果需要转换后才能进行数字计算
  4. /、// 和 % 分别得到除法结果、向下取整的商和余数
  5. 浮点数可能存在微小误差,展示时可以按需要使用 round()

延伸阅读:Python 3.14 数字入门、浮点数:问题和限制