返回介绍

生产环境下的 pm2 部署

发布于 2025-02-22 21:56:42 字数 2887 浏览 0 评论 0 收藏 0

使用 ShipIt 实现全自动一键部署

必须逾越的各种坑

任何编程语言都无法完美的解决你的问题,遇到什么坑,就只能求助社区,不然自己闷头解决就好,别抱怨,世界本来就不完美。

Js 对数据计算处理的各种问题

1.问题再现

(1)parseInt() 最好不用

不要将 parseInt 当做转换 Number 和 Integer 的工具。

问题:默认,对小于 0.0000001 (1e-7) 的数字转换成 String 时,js 会将其变成 科学记号法 ,再对这个数进行 parseInt 操作就会导致问题发生。即:

parseInt(0.0000008) === 8

解析:

常见的问题有浮点数比较:

console.log((0.1 + 0.2) == 0.3);  // false
console.log((0.1 + 0.2) === 0.3); // false
console.log(0.1 + 0.2); // 0.30000000000000004

再有:

parseInt(1000000000000000000000.5, 10); // 1

parseInt 的第一个类型是字符串,所以会将传入的参数转换成字符串,也就是 String(1000000000000000000000.5) 的结果为 '1e+21' 。 parseInt 并没有将 'e' 视为一个数字,所以在转换到就停止了。

这也就可以解释 parseInt(0.0000008) === 8 :

String(0.000008);  // '0.000008'
String(0.0000008); // '8e-7'

参考: http://www.tuicool.com/articles/7nMbea

(2) 对于大数据,js 有限制

问题:

第三方 api 提供的数据:

{"content": "Hi", "created_at": 1340863646, "type": "text", "message_id": 5758965507965321234, "from_user": "userC"}

其中 message_id 是 19 位 number 类型的。我用 JSON.parse 解析成 JSON 对象获取其中的信息,方法如下:

var jsonStr = '{"content": "Hi", "created_at": 1340863646, "type": "text", "message_id": 5758965507965321234, "from_user": "userC"}';
var jsonObj = JSON.parse(jsonStr);
console.log(jsonObj.message_id);//得到结果是:5758965507965321000

得到的结果的最后三位变成 000 了。超过 16 位的数据解析后均会变为 000;

解析:

浮点数范围:

as  large  as ±1.7976931348623157 × 10 的 308 次方
as small as ±5 × 10 的−324 次方

精确整数范围:

The JavaScript number format allows you to exactly represent all integers between
−9007199254740992  and 9007199254740992 (即正负 2 的 53 次方)

数组索引还有位操作:

正负 2 的 31 次方

参考:

https://cnodejs.org/topic/4ff679c84764b7290214460a

https://cnodejs.org/topic/4fb3722c1975fe1e132b5a9a

2.终极答案

使用 node-bignum ,地址: https://github.com/Ebookcoin/node-bignum

社区出现了很多 bignumber 包,但只有 node-bignum 可以完美解决上述问题。诸如 bignumber.js 等无法解决小数问题(问题 1)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文