当前位置: 首页 > news >正文

JS Number 精度丢失问题

JS Number 精度丢失问题

【问】{a:2020671179492315140,b:123} 在preview 是 2020671179492315100 和 response 则是原值.
【答】这是一个非常典型的 JavaScript 精度丢失问题,也是导致你看到“返回值与数据库不符”的直接原因。
开发者工具在解析 JSON 响应时,自动将超长数字转换为了 JavaScript 的 Number 类型进行展示。Number只能精确 15-17 位 的整数,超长则末尾的几位就会被“抹平”或变成 0。要解决这个问题,必须在后端做处理,将长整型 ID 转换为字符串返回。

【问】Number只能精确 15-17 位 的整数,为啥结果还是19位,但是尾部是0?
【答】IEEE 754 双精度浮点数存储机制:它不是简单的“把后几位删了”,而是“存不下那么精确的数,只能找个最接近的能存的数”。类比—— 你想存:1234567890123456789(19 位)
计算器会说:“我只能存 3 位有效数字,我看你这个数大概是 123 后面跟着 16 个 0”。
结果变成了:1230000000000000000。