原文地址:https://www.css88.com/archives/9318 (受益匪浅)
JavaScript 中经常会碰到数值计算问题,偶尔会在不经意间报一个不是bug的bug。今天来说说一个特殊的例子。我以0.0011BTC 价格买入 0.0002CZR 计算出了的金额是 0.00000022BTC,而 JavaScript 计算出来的金额是 2.2e-7
。值是对的,只是用了科学计数法,也是数值类型。但是问题来了,一般用户用户看不懂 2.2e-7
,那么就把它转换成 0.00000022
吧。然而问题了,我用尽办法,怎么样都无法将 2.2e-7
转换成直观的 0.00000022
。或许你会嘲笑我,告诉我直接用 .toFixed()
方法。但是新问题又来了, .toFixed()
会保留足够的小数位,比如:2e-7.toFixed(8)
得到的值是 0.00000020
,2e2.toFixed(8)
得到的值是 200.00000000
。最后的 0
让我感到多余…
问题分析
问题还是要解决,只能深入了解 JavaScript 中科学计数法相关的知识。对于极大或者极小的数,可以用科学计数法 e
来表示的浮点数值来表示。科学计数法允许字母e
或 E
的后面,跟着一个整数,表示这个数值的指数部分。
以下两种情况,JavaScript 会自动将数值转为科学计数法表示
(1) 小于1且小数点后面带有6个0以上的浮点数值:
JavaScript 代码:
- 0.0000003 // 3e-7
- 0.00000033 // 3.3e-7
- 0.000003 // 0.000003
(2) 整数位数字多于21位:
JavaScript 代码:
- 1234567890123456789012 //1.2345678901234568e+21
- 1234567890123456789012.1 //1.2345678901234568e+21
- 123456789012345678901 //123456789012345680