JavaScript 浮点数计算问题

JavaScript 浮点数神坑当属 0.1 + 0.2 == 0.3false

> 0.1 + 0.2 == 0.3
false
> 0.1 + 0.2
0.30000000000000004
>

还有一些比较隐蔽的问题,比如 Math.roundNumber.prototype.toFixed 也都不是能完全正常工作的。

> Math.round(1.105 * 100)
111
> Math.round(1.015 * 100)
101
> Math.round(1.025 * 100)
102
> 0.25.toFixed(1)
'0.3'
> 0.35.toFixed(1)
'0.3'

Math.round、toFixed 计算出错主要因为浮点数不能精确表示。

在这里 0.35 和 1.015 的值都不准确,一个办法是转换成整数计算再除以对应的十百千;另一个办法是采用现有的 lib,比如 accounting

> 1.015 * 100
101.49999999999999

代码运行环境

D:\node -v
v8.1.0

如何修改 npm-debug.log 路径,无解

目前没有找到修改 npm-debug.log 路径的方法,除非修改源码。

npm 版本是 3.3.12

这是 2014 年 stackoverflow 上的提问 Change npm-debug.log location,以及在 github 上讨论的 issue
Put npm-debug.log file in the cache folder, not cwd #6744
npm-debug.log could be written to /tmp or similar #1548
以及假想解决方案
Make npm-debug.log path configurable. #5252
将 log 文件写入 app 目录的风险显而易见,尤其正式环境一般都不会开放 app 目录写权限。

在源文件 npm/lib/util/error-handler.js 中 writeLogFile() 内部已经 hardcode writeStream(‘npm-debug.log’),当初是如何构思的?

紧接着想到是否可以禁用 node-debug.log, 不过这并不是一个很好的解决方案.

 

npm 命令行参考 官方 Shorthands and Other CLI Niceties

 

npm –prefix 指定目录

最新上线一个 nodejs 项目,使用 pm2 做进程管理器。

因为 pm2 更适合用作正式环境进程管理,不像开发环境使用 nodemon 实时监听文件改动重启 node 进程,所以每次发布之后需要执行 pm2 reload all 零延时载入代码。

pm2 reload all 被配置到 package.json 的 scripts,执行命令 npm run pm2_reload 即可载入代码。

现在的问题是 node 项目部署在 /www/ran-api,每次需要执行 cd /www/ran-api 进入该目录,才能执行 npm 命令,否则就会提示找不到 package.json 文件。

后来终于在 npm 官方文档 https://docs.npmjs.com/misc/config 找到 –prefix 配置,也可以直接查看 npm 自带的 Markdown 教程,一般位于 /nodejs 安装目录/node_modules/npm/doc/misc/npm-config.md

执行下述命令就不用再进入指定目录了:

/nodejs/npm –prefix=/www/ran-api run pm2_reload

其他命令也可以设置 –prefix,比如 npm config list

[~]$ /nodejs/bin/npm config list –prefix=/www/ran-api
; cli configs
; 这是增加的命令行参数 prefix,会被设置到 npm.localPrefix
prefix = “/www/ran-api”
user-agent = “npm/3.3.12 node/v5.5.0 linux x64”

; node bin location = /nodejs/bin/node
; cwd = /home/ran
; HOME = /home/ran
; “npm config ls -l” to show all defaults.