请教一个 JS Number 的问题

2022-08-24 16:54:36 +08:00
 Guidoo

Number(44211572582780928)

为啥会输出 44211572582780930

2142 次点击
所在节点    JavaScript
13 条回复
VeryZero
2022-08-24 16:57:18 +08:00
精度丢失
memedahui
2022-08-24 16:57:21 +08:00
js 精度问题,一般的语言都是这种问题了,java 用 bigdecimal 类,js 推荐用 bignumber.js
hkyshefavor
2022-08-24 17:00:50 +08:00
超过 Number.MAX_SAFE_INTEGER 值了,精度丢失
foolnius
2022-08-24 17:01:23 +08:00
可以通过 Number.MAX_SAFE_INTEGER 查看最大值
Guidoo
2022-08-24 17:02:17 +08:00
@VeryZero
@memedahui
@hkyshefavor 感谢感谢 找到原因了。但是还是好奇为啥会 +2
yukinotech
2022-08-24 17:06:41 +08:00
安利一下自己写的库,https://github.com/yukinotech/JSBD ,实现 tc39 bigdecimal 提案 https://github.com/tc39/proposal-decimal
Jooooooooo
2022-08-24 17:09:45 +08:00
大数字都建议直接用 string 省事.
seakingii
2022-08-24 17:22:19 +08:00
@Guidoo 别人都说精度丢失了还问为啥 ....
-
实在要了解底层原因,建议去看计算机硬件相关的入门书籍
-
简单的说,用有限的硬件空间来存储无限的浮点数字难(比如浮点数 1/3 = 0.3333333333333333....),必须要在精度上有个取舍

-
如果只是存储之类的,可以用字符串,如果要运算,可以考虑 bignumber.js 这类的外部库
dudubaba
2022-08-24 19:09:52 +08:00
判断最大安全值 Number.isSafeInteger() 来判断整数的合法性,当超过时可以转换为字符串或者用 BigInt(44211572582780928)
mxT52CRuqR6o5
2022-08-24 19:11:16 +08:00
IEEE 754
Guidoo
2022-08-24 20:35:59 +08:00
Guidoo
2022-08-24 20:36:50 +08:00
@dudubaba 受教了
Jobing
2022-11-05 21:41:03 +08:00
精度丢失,可以用 npm 库 搜索 json-bn 开源库解决。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875101

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX