数字(Number)
什么是 JSON 数字?
JSON 的数字(Number) 直接写数字即可,不需要加引号。
JSON 的数字类型非常简洁——不区分整数、浮点数、长整型,所有数字统一都叫 Number。
简单示例
2018
12
-88
36.5
3.14159
1.4e9
数字的四种写法
根据 RFC 8259,JSON 数字有 4 种合法形式:
1. 整数
18
2018
100
1000
10000
规则:
- 直接写数字,不加引号
- 不允许前导零(
01、007是非法的) - 零本身写成
0
| 写法 | 是否合法 | 原因 |
|---|---|---|
2018 | ✅ 合法 | 正常整数 |
0 | ✅ 合法 | 零 |
-88 | ✅ 合法 | 负数 |
01 | ❌ 非法 | 不允许前导零 |
007 | ❌ 非法 | 不允许前导零 |
2. 小数(浮点数)
36.5
26.5
188.88
88.8
8.8
23.20
200.00
100.00
3.14159
规则:
- 小数点前后都必须有数字
.5和5.都是非法的
| 写法 | 是否合法 | 原因 |
|---|---|---|
36.5 | ✅ 合法 | 正常小数 |
188.88 | ✅ 合法 | 正常小数 |
.5 | ❌ 非法 | 小数点前必须有数字 |
5. | ❌ 非法 | 小数点后必须有数字 |
3. 负数
-18
-2018
-88.8
-3.14159
规则:
- 负号
-只能写在数字最前面 - 负号后面直接跟数字,不能有空格
4. 科学计数法
1.4e9
1.4E9
-2.5e10
3.14e-10
规则:
- 用
e或E表示"乘以 10 的几次方" e后面可以跟正号+或负号-e后面必须跟整数
| 写法 | 含义 | 等于 |
|---|---|---|
1.4e9 | 1.4 × 10⁹ | 1400000000 |
1.4E9 | 1.4 × 10⁹ | 1400000000 |
-2.5e3 | -2.5 × 10³ | -2500 |
3.14e-2 | 3.14 × 10⁻² | 0.0314 |
JSON 数字 vs 字符串数字
非常重要:加引号的是字符串,不加引号的是数字!
{
"yearString": "2018",
"yearNumber": 2018,
"priceString": "188.88",
"priceNumber": 188.88
}
| 键 | 值 | 类型 | 能否做数学运算 |
|---|---|---|---|
yearString | "2018" | 字符串 | ❌ 不能 |
yearNumber | 2018 | 数字 | ✅ 能 |
priceString | "188.88" | 字符串 | ❌ 不能 |
priceNumber | 188.88 | 数字 | ✅ 能 |
⚠️ 如果你把数字写成了字符串,程序在计算时可能会出错,或者把两个数字拼接起来而不是相加!
JSON 不支持这些数字
JSON 不支持以下特殊数值:
| 值 | 说明 | JSON 替代方案 |
|---|---|---|
Infinity | 无穷大 | 用字符串 "Infinity" 或 null |
-Infinity | 负无穷大 | 用字符串 "-Infinity" 或 null |
NaN | 非数字 | 用字符串 "NaN" 或 null |
0x1A | 十六进制 | 转成十进制写 26 |
0b1010 | 二进制 | 转成十进制写 10 |
1_000_000 | 数字分隔符 | 直接写 1000000 |
实战:飞翔科技场景中的数字
场景一:购物场景
{
"scene": "购物",
"vipLevel": 1,
"minAge": 18,
"productId": 10086,
"quantity": 1000,
"buyCount": 2,
"orderId": 20251201123456,
"imageFileSize": 5242880,
"price": 188.88,
"discount": 88.8,
"shippingFee": 8.8,
"discountRate": 0.314
}
场景二:旅游场景
{
"scene": "旅游",
"travelYear": 2018,
"minHeight": 120,
"maxWeight": 150,
"dailyVisitorLimit": 10000,
"ticketsSold": 5230,
"worldPopulation": 8000000000,
"chinaPopulation": 1400000000,
"guangdongPopulation": 125000000,
"morningTemp": 26.5,
"noonTemp": 32.0,
"ticketPrice": 100.00,
"guideFee": 200.00,
"moonDistance": 384400.12345
}
场景三:公司工资场景
{
"scene": "工资",
"deptCode": 2,
"joinYear": 2018,
"employeeAge": 28,
"empId": 10001,
"performanceScore": 100,
"attendanceDays": 22,
"companyAssets": 100000000000,
"basicSalary": 8888.00,
"performanceBonus": 18888.00,
"managerSalary": 232000.00,
"ceoSalary": 1000000.00,
"socialSecurity": 2320.00,
"personalTax": 1666.66,
"accountBalance": 6666.66,
"raiseRate": 1.414
}
场景四:医疗场景
{
"scene": "医疗",
"roomNumber": 6,
"bloodType": 3,
"patientAge": 18,
"heartRate": 72,
"diastolicBP": 80,
"medicalId": 10086,
"dailyVisits": 10000,
"medicalInsuranceCoverage": 1400000000,
"bodyTemp": 36.5,
"systolicBP": 120.5,
"drugPrice": 23.20,
"treatmentCost": 200.00,
"drugHalfLife": 3.14159
}
精度问题
RFC 8259 提到:JSON 数字的精度和范围取决于解析它的程序。
大多数程序使用 IEEE 754 双精度浮点数 来存储 JSON 数字,这意味着:
- 整数范围:大约 ±9,007,199,254,740,991(约 ±9 千万亿)以内是精确的
- 超过这个范围的整数可能会丢失精度
- 极大或极小的数字建议用字符串表示
{
"safeInteger": 9007199254740991,
"unsafeInteger": 9007199254740993,
"bigNumberAsString": "12345678901234567890"
}
💡 如果你需要处理非常大的数字(如银行账号、精确的大额金额),建议用字符串存储,避免精度丢失。
常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
"2018" | 加了引号,变成字符串 | 2018 |
01 | 前导零非法 | 1 |
5. | 小数点后缺数字 | 5.0 |
.5 | 小数点前缺数字 | 0.5 |
1,000 | 不能用逗号分隔 | 1000 |
0xFF | 不支持十六进制 | 255 |
Infinity | 不支持 | "Infinity" 或 null |
一句话总结
提示
JSON 数字直接写,不加引号。支持整数、小数、负数、科学计数法。不支持前导零、十六进制、Infinity、NaN。大数字建议用字符串!