【问题标题】:Pitfalls with using scientific notation in JavaScript在 JavaScript 中使用科学记数法的陷阱
【发布时间】:2018-03-04 03:42:56
【问题描述】:

这个问题不是寻求开发者代码格式的意见。就个人而言,我更喜欢在我的 JS 代码中尽可能使用科学记数法,因为我相信它更具可读性。对我来说,6e8600000000 更具可读性。话虽如此,我只是在寻找在 JS 中以科学计数法指定数字的潜在风险和缺点。我不经常在野外看到它,我想知道这是否有技术原因,或者仅仅是因为开发人员的 druthers。

【问题讨论】:

  • 不确定我是否理解这个问题。您想知道是否每个环境都支持这种表示法吗?或者你是否会得到你指定的值?
  • @FelixKling,说得好。我更多地考虑保留指定的原始值。不过,我对在我的 JS 中使用科学记数法时可能出现的任何问题持开放态度。
  • @EvanWieland,不确定风险,但 JS 确实允许科学符号。维基百科In most popular programming languages, 6.022E23 (or 6.022e23) is equivalent to 6.022×1023, and 1.6×10−35 would be written 1.6E-35 (e.g. Ada, Analytica, C/C++, FORTRAN (since FORTRAN II as of 1958), MATLAB, Scilab, Perl, Java,[4] Python, Lua, JavaScript, and others).
  • 这个链接可能有助于更好地理解,为什么科学记数法不能在没有转换的情况下按原样处理。我不认为有任何风险或缺点。只要编程语言支持,一切都很好。 blog.penjee.com/binary-numbers-floating-point-conversion
  • 我必须记住对大数使用这种表示法,以避免用鼠标指针计数零......

标签: javascript syntax scientific-notation


【解决方案1】:

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

人类用户并不是唯一想要阅读数字的人。它似乎 D3遇到翻译时会抛出异常 包含科学计数法坐标的变换

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

此外,根据经验,您通常可以拥有较大的数字,其意义在于其各个数字,例如 ID 或电话号码。在这种情况下,将这些数字减少为科学计数法会损害可读性。

【讨论】:

  • 我看不出这句话与这里有什么关系。您链接到的问题是关于 JavaScript 如何将大数转换为字符串。这不是关于指定科学记数法中的数字(这个问题)。
  • 你说得对,只有当他做了我在第二句话中提到的事情时才有意义:In addition, if you want change the string representation, as opposed to just what the literal looks like in your source...应该把它放在第一位。
  • 但是无论使用科学记数法都会发生这种情况。它发生在所有大于某个值的数字上。
【解决方案2】:

您看不到科学记数法“经常在野外”,因为在 JS 中实际输入的唯一数字往往是常量:

  • 以代码为中心的常量(例如枚举和级别)往往很小。
  • 物理/数学常数(例如 π 或 e)往往具有高度特异性。

这些都没有从科学记数法中获得太多好处。

我见过Plank's constant 'in the wild' 为:

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

通常有意义的另一个地方是时间限制,例如一天中的毫秒数为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 啊,非常好的观点,我也看到了!我会更新答案。
  • 看不懂DE用户的样例(我猜是德国用户)。不是2e4 (20000) 带德文小数点,2e1 (20) 带英文小数点?
  • @AlbertoMartinez 这取决于本地化解析器 - 无论哪种方式它都不会正确。是的,这意味着德国本地用户;我曾经研究过的一个系统发现了一个错误,该错误有效地将数千名德国输入工资乘以 100(感谢 e4 变成了 e6)——修复起来很有趣 :-|我的观点是:如果您将整数作为字符串传递,那么 i18n 是一个比科学记数法更大的问题 - 后者的解析更加一致 - 我宁愿使用 "2e4" 而不是 "20,000.00""20.000,00" 任何一天。
  • 我同意,我只是要求澄清电子符号,生活在一个使用与德国相同的小数点的国家意味着我很清楚这些问题:-)
【解决方案3】:

E-notation 表示应该乘以 10 的数字 到给定的权力。

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

虽然 E 代表指数,但通常引用符号 作为(科学)电子符号而不是(科学)指数 符号。电子符号的使用有助于数据输入和可读性 在文本交流中,因为它最大限度地减少击键,避免减少 字体大小并提供更简单和更简洁的显示,但它是 在出版物中不鼓励。 Submission Guidelines for Authors: HPS 2010 Midyear Proceedings

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多