数字
在 JavaScript 中,我们只有一种数字类型number
,它能处理整数和浮点数。Python 将数字进行了更细致的分类,提供了三种主要的数值类型:整数(int
)、浮点数(float
)和复数(complex
),每种类型都有其特定的用途和优势。
类型概述
Python 的数值类型比 JavaScript 更加丰富:
整数(int)
JavaScript 中所有数字都是浮点数类型,即使看起来像整数:
JavaScript 数字有精度限制:
Python 的整数是真正的整数类型,并且支持任意精度。这是与 JavaScript 的一个重要区别:
关键区别:JavaScript 中所有的数字(包括看起来像整数的)都采用 IEEE 754 双精度浮点数标准,因此最大安全整数是 2^53-1,超过这个范围就可能失去精度,必须使用 BigInt 类型。而 Python 的整数(int
)是独立的数据类型,采用任意精度算法实现,没有大小限制,这在密码学、数学计算、金融计算等需要精确大数运算的场景中具有巨大优势。
浮点数(float)
当处理小数时,Python 的浮点数(float
)与 JavaScript 的浮点数一样,都遵循 IEEE 754 双精度浮点数标准:
浮点数精度问题
由于 IEEE 754 标准的限制,JavaScript 和 Python 的浮点数都存在精度问题:
这种精度问题在金融计算中尤其危险,需要特别注意,这里介绍几种解决方案:
科学计数法
两种语言都支持科学计数法:
复数(complex)
这是 Python 独有的数值类型,JavaScript 原生不支持复数:
注意 Python 使用j
而不是数学中常用的i
来表示虚数单位,这是因为在工程领域(特别是电气工程)习惯使用j
。
特殊数值
IEEE 754 标准定义了一些特殊的浮点数值,JavaScript 和 Python 都支持:
这些特殊值在数学计算和数据处理中很有用,比如表示缺失数据、计算溢出或无效运算结果。
类型转换
JavaScript 的数值转换有时比较宽松:
Python 的转换更加严格和明确:
转换错误处理
运算
基本运算符
Python 和 JavaScript 的基本运算符基本相同:
高级运算符
Python 和 JavaScript 都支持一些高级运算符,但有细微差异:
增强赋值运算符
JavaScript 中我们经常使用 ++
和 --
进行自增自减操作:
重要差异:Python 没有 ++
和 --
操作符,必须使用 +=
和 -=
:
数值比较
数值比较在两种语言中基本相同:
不同类型的数值比较
Python 允许不同数值类型之间的比较:
内置数学函数
Python 提供了一些基本的内置数学函数:
数学模块
JavaScript 有 Math 对象,提供更丰富的数学函数:
Python 也有 math 模块:
数值格式化
在前端开发中,我们经常需要格式化数字用于显示:
Python 提供了多种格式化方式,格式化语法在字符串章节有详细介绍:
随机数
JavaScript 使用 Math.random()
生成 0-1 之间的随机浮点数,然后通过数学运算得到需要的范围:
Python 的 random 模块提供了更丰富和便利的随机数函数:
random.random()
- 与 JavaScript 相同,生成 0-1 之间的随机浮点数random.randint(a, b)
- 生成 a 到 b 之间的随机整数,两端都包含random.randrange(start, stop)
- 生成 start 到 stop 之间的随机整数,含左不含右(类似range()
函数)random.uniform(a, b)
- 生成 a 到 b 之间的随机浮点数random.choice(seq)
- 从序列中随机选择一个元素random.shuffle(list)
- 随机打乱列表(原地修改)
进制转换
JavaScript 和 Python 都支持多种进制的转换:
数值检查
JavaScript 和 Python 都提供了数值类型和特殊值的检查函数:
数值操作一览
操作 | JavaScript | Python |
---|---|---|
基本运算 | ||
加减乘除 | + - * / | + - * / |
幂运算 | ** 或 Math.pow(a, b) | ** |
整除 | Math.floor(a / b) | a // b |
取余 | % | % |
增强赋值 | ||
自增自减 | ++ -- 或 += 1 -= 1 | += 1 -= 1 |
加减赋值 | += -= | += -= |
乘除赋值 | *= /= | *= /= |
幂运算赋值 | **= | **= |
取余赋值 | %= | %= |
整除赋值 | x = Math.floor(x / y) | x //= y |
统计函数 | ||
最大值 | Math.max(a, b, c) | max(a, b, c) |
最小值 | Math.min(a, b, c) | min(a, b, c) |
求和 | array.reduce((a,b)=>a+b, 0) | sum(iterable) |
特殊值 | ||
正无穷 | Infinity | float('inf') |
负无穷 | -Infinity | float('-inf') |
非数字 | NaN | float('nan') |
数值检查 | ||
是否有限 | Number.isFinite(x) | math.isfinite(x) |
是否无穷 | !Number.isFinite(x) && !Number.isNaN(x) | math.isinf(x) |
是否 NaN | Number.isNaN(x) | math.isnan(x) |
类型转换 | ||
转整数 | parseInt(str) | int(str) |
转浮点数 | parseFloat(str) | float(str) |
检查整数 | Number.isInteger(x) | isinstance(x, int) |
随机数 | ||
0-1随机数 | Math.random() | random.random() |
整数随机数 | Math.floor(Math.random()*n)+1 | random.randint(1, n) |
浮点随机数 | Math.random() * (max-min) + min | random.uniform(min, max) |
随机选择 | arr[Math.floor(Math.random()*arr.length)] | random.choice(list) |
格式化 | ||
保留小数位 | num.toFixed(2) | f"{num:.2f}" |
千位分隔符 | num.toLocaleString() | f"{num:,}" |
科学计数法 | num.toExponential(2) | f"{num:.2e}" |
进制转换 | ||
转二进制 | num.toString(2) | bin(num)[2:] |
转八进制 | num.toString(8) | oct(num)[2:] |
转十六进制 | num.toString(16) | hex(num)[2:] |
解析进制 | parseInt(str, base) | int(str, base) |
数学函数 | ||
绝对值 | Math.abs(x) | abs(x) |
平方根 | Math.sqrt(x) | math.sqrt(x) |
向上取整 | Math.ceil(x) | math.ceil(x) |
向下取整 | Math.floor(x) | math.floor(x) |
四舍五入 | Math.round(x) | round(x, 位数) |
三角函数 | Math.sin(x) Math.cos(x) | math.sin(x) math.cos(x) |
对数函数 | Math.log(x) Math.log10(x) | math.log(x) math.log10(x) |
指数函数 | Math.exp(x) | math.exp(x) |
常数 | ||
圆周率 | Math.PI | math.pi |
自然常数 | Math.E | math.e |
小结
Python 的数值系统相比 JavaScript 更加丰富和精确:
- 类型细分明确:
int
、float
、complex
三种类型各司其职,整数支持任意精度 - 运算符丰富:提供
//
(整除)和**
(幂运算)等便利运算符 - 类型转换严格:避免隐式转换带来的意外结果,错误处理更明确
- 数学功能强大:内置函数和 math 模块提供丰富的数学运算功能
- 精度控制:decimal 模块解决浮点数精度问题,适合金融等精确计算场景
- 格式化灵活:f-string 和 format 方法提供强大的数值格式化能力
- 进制转换便利:内置函数支持多种进制转换操作
理解这些数值类型的特性和使用场景,能帮助你在数据处理、科学计算、Web 开发等不同场景中选择合适的数值类型和处理方法。特别是 Python 在处理大整数和精确小数方面的优势,让它在数据科学和金融计算领域广受欢迎。
练习
完成一个餐厅订单计算系统,练习数字运算和格式化:
=== 餐厅订单计算系统 ===
商品价格: [28.5, 32.8, 45.0]
商品名称: ["牛肉面", "宫保鸡丁", "红烧肉"]
=== 价格统计 ===
最贵菜品: ¥45.00
最便宜菜品: ¥28.50
总计金额: ¥106.30
平均价格: ¥35.43
=== 优惠计算 ===
满100减10元: ¥96.30
服务费 (10%): ¥9.63
最终金额: ¥105.93
=== 支付处理 ===
向上取整金额: ¥106
向下取整金额: ¥105
四舍五入金额: ¥106
2人分摊: 每人 ¥52.97
=== 随机活动 ===
随机折扣: 85%
折扣后金额: ¥90.04
抽奖编号: 7392