Skip to content

数字

17944字,阅读约113分钟

在 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 都提供了数值类型和特殊值的检查函数:

数值操作一览

操作JavaScriptPython
基本运算
加减乘除+ - * /+ - * /
幂运算**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)
特殊值
正无穷Infinityfloat('inf')
负无穷-Infinityfloat('-inf')
非数字NaNfloat('nan')
数值检查
是否有限Number.isFinite(x)math.isfinite(x)
是否无穷!Number.isFinite(x) && !Number.isNaN(x)math.isinf(x)
是否 NaNNumber.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)+1random.randint(1, n)
浮点随机数Math.random() * (max-min) + minrandom.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.PImath.pi
自然常数Math.Emath.e

小结

Python 的数值系统相比 JavaScript 更加丰富和精确:

  1. 类型细分明确intfloatcomplex三种类型各司其职,整数支持任意精度
  2. 运算符丰富:提供//(整除)和**(幂运算)等便利运算符
  3. 类型转换严格:避免隐式转换带来的意外结果,错误处理更明确
  4. 数学功能强大:内置函数和 math 模块提供丰富的数学运算功能
  5. 精度控制:decimal 模块解决浮点数精度问题,适合金融等精确计算场景
  6. 格式化灵活:f-string 和 format 方法提供强大的数值格式化能力
  7. 进制转换便利:内置函数支持多种进制转换操作

理解这些数值类型的特性和使用场景,能帮助你在数据处理、科学计算、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
参考答案

基于 MIT 许可发布