在JavaScript中使用科学计数法的陷阱

10

此问题寻求开发者的代码格式化意见。个人而言,当我可以使用科学计数法时,更喜欢在我的JS代码中使用它,因为我认为它更易读。对于我来说,6e8600000000更容易阅读。 话虽如此,我仅寻找在JS中指定科学计数法数字的潜在风险和缺点。 我很少在实践中看到它,想知道是否有技术上的原因或仅仅是开发者的爱好。


我不确定我理解这个问题。您是想知道每个环境是否支持此符号表示法?还是您是否会得到您指定的值? - Felix Kling
@FelixKling,说得好。我更多地考虑保留指定的原始值。不过,如果在我的JS中使用科学计数法时出现任何问题,我也很乐意接受。 - Evan Wieland
@EvanWieland,不确定风险,但JS确实允许科学计数法。维基百科上写道:“在大多数流行的编程语言中,6.022E23(或6.022e23)等同于6.022×1023,而1.6×10−35将被写成1.6E-35(例如Ada,Analytica,C / C ++,FORTRAN(自1958年以来的FORTRAN II),MATLAB,Scilab,Perl,Java,Python,Lua,JavaScript等)。 - user5249203
这个链接可能更好地帮助理解,为什么科学计数法不能直接处理而需要转换。我认为没有任何风险或不利之处。只要编程语言支持就没问题了。https://blog.penjee.com/binary-numbers-floating-point-conversion/ - user5249203
我必须记住使用这种表示法来避免用鼠标指针计算零。 - Alberto Martinez
3个回答

3

在实际应用中,科学计数法并不常见,因为在JavaScript中实际键入的数字往往是常量:

  • 以代码为中心的常量(如枚举和级别)往往很小。
  • 物理/数学常量(如π或e)往往非常具体。

这些都不太需要使用科学计数法。

我曾经看到过普朗克常数在实际应用中被表示为:

const h = 6.62607004e-34;
console.log('Plank', h);

在IT技术中,另一个常见的应用场景是时间限制,例如一天中的毫秒数可以表示为864e5。例如:

function addDaysToDate(date, days) {
  if (days === 0)
    return date;
  date.setTime(864e5 * days + date.valueOf());
  return date;
}

const now = new Date();
const thisTimeTomorrow = addDaysToDate(now, 1);
console.log('This time tomorrow', thisTimeTomorrow);

我认为没有任何技术上的理由不使用这种表示法,更多的是开发者避免硬编码数字。

我不认为有任何风险。你可能需要小心字符串中的数字,但如果你这样做,那么这个语法比数字本地化要小得多(例如,一个DE用户输入“20.000,00”,期望得到2e4,但由于不变的数字格式交换了千位分隔符和小数点,结果得到了2e6)。

我还想补充一点,JS默认情况下会输出该语法以表示较小的数字,但在某个点之后(各个浏览器不同),会避免使用该语法来表示较大的数字:

console.log('Very small', 1234 / 100000000000)
console.log('Large, but still full in some browsers', 1e17 * 1234)
console.log('Large, scientific', 1e35 * 1234)


超时时间,如 60e3ms,通常是一个合理的科学计数法范围内的常量。 - Bergi
@Bergi,非常好的观点,我也注意到了!我会更新答案。 - Keith
我不理解DE用户的示例(我想这是指德国用户)。使用德国小数逗号,2e4(20000)不应该是正确的表示方式吗?而使用英文小数点,则应该是2e1(20)吧? - Alberto Martinez
@AlbertoMartinez 这取决于本地化解析器 - 无论如何,结果都不正确。是的,它表示带有德语环境的用户;我曾经使用过的一个系统发现了一个错误,有效地将数千个德语输入工资乘以100(因为e4变成了e6)- 那很有趣 :-| 我的观点是:如果你把数字传递为字符串,i18n比科学计数法要复杂得多 - 后者更容易被解析 - 我宁愿用“2e4”而不是“20,000.00”或“20.000,00”任何一天。 - Keith
我同意,我只是在询问科学计数法的澄清问题,生活在一个和德国使用相同小数点符号的国家意味着我对这些问题非常清楚 :-) - Alberto Martinez

1

E-notation 表示一个数应该乘以10的某个次幂。

这不是科学指数表示法。其中一个问题是,在 JavaScript 中,e 表示的是“乘以10的某个次幂”,而不是 自然对数的底数 e,在浏览器中表示为 Math.E。对于熟悉数学常数 e 的人来说,JavaScript 中的 e 具有完全不同的含义。6 * Math.pow(10, 8) 返回预期结果,不包括使用 JavaScript 产生的 e

虽然 E 代表指数,但该符号通常被称为(科学)E-记数法,而不是(科学)指数记数法。使用 E-记数法可简化数据输入和文本交流中的可读性,因为它最小化击键次数,避免了缩小字体大小并提供了更简洁的显示,但不鼓励在出版物中使用。

1

来自this问题的O. R. Mapper:

不仅人类用户想要读取数字。当遇到包含科学计数法坐标的翻译变换时,D3会抛出异常。

此外,如果您想更改字符串表示形式,而不仅仅是源代码中的文字外观,则必须小心序列化/存储数据。

此外,根据经验,通常您可能有一些重要程度在于其各个数字(如ID或电话号码)的大量数字。 在这种情况下,将这些数字缩小为科学计数法会影响可读性。


我不明白这个引用与此有何关联。您链接的问题是关于JavaScript如何将大数字转换为字符串,而不是关于指定科学计数法中的数字(本问题)。 - Felix Kling
你说得对,只有在他按照我第二句话所提到的去做时才相关:“此外,如果你想改变字符串的表示方式,而不仅仅是源代码中字面上的样子...” 应该先把这个放在前面。 - code11
1
但无论是否使用科学计数法,这种情况都会发生。它发生在所有大于某个值的数字上。 - Felix Kling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接