
1 icyalala 2021-02-01 00:09:16 +08:00 JSON 标准并没有规定 Number 的类型。 uint64 、int64 、double 表示的范围和精度都是不一样的。 |
2 nightwitch 2021-02-01 00:21:18 +08:00 |
3 YouLMAO 2021-02-01 00:26:59 +08:00 via Android 楼主是小年轻,没做过跨国项目,所以以为 Javascript 代表全世界,Javascript 用 double 存放 int64 会丢失精度,所以跨国项目 int64 在 JSON 里面都是 用双引号括起来数字,然后 Javascript 使用高精度库函数处理,而 c 和 go 和 Java 使用默认 signed int64 处理 |
4 BrettD 2021-02-01 00:31:36 +08:00 via iPhone JSON 不一定是 Javascript 吧 |
7 YouLMAO 2021-02-01 02:12:31 +08:00 via Android |
8 xcstream 2021-02-01 02:26:09 +08:00 控制台 10000000000000000000+1 = 10000000000000000000 |
9 AV1 2021-02-01 09:22:02 +08:00 跨语言交换 JSON 数据还是用 String 表示数字吧。 甚至可以说,JSON 里的 Number,除了 js 自己用,其他语言别用。 |
10 jim9606 2021-02-01 10:54:53 +08:00 不是所有语言都像 Python 和 JS 那样内置自动适应的数值类型,基本上强类型语言都有内置支持。 实际上这类强类型语言的 JSON 库都会提供多个函数输出数值类型,使用者需要自行保证不会出现溢出和预期之外的精度损失。 通常认为 double 取值范围最大,但这是以损失部分精度为代价的,浮点精度损失问题是包括 JS 在内的所有语言都存在的问题,追求字面量精确的应该用字符串。 |
11 jim9606 2021-02-01 10:56:05 +08:00 打错了,强类型语言基本没有内置支持自动适应的数值类型 |
12 YouLMAO 2021-02-01 12:31:11 +08:00 via Android @jim9606 表述错误,Python 是不会丢失精度的,而且 Python 有高精度整数,连 int128 都可以, 但 js 没有 int64,这是根本问题的最根本 |
13 sl0000 OP |
14 BingoXuan 2021-02-01 13:24:29 +08:00 via Android json 是 ASCII 表示的,取决于序列化库的精度处理,Python 的 ujson 就有 float 精度问题,内置 json 就没有。对于机器来说,msgpack 是个好东西 |