【问题标题】:Explanation of JavaScript Decimal Rounding example at MDN?MDN 上 JavaScript 十进制舍入示例的解释?
【发布时间】:2015-04-27 18:42:07
【问题描述】:

我正在学习 JavaScript,我听说在使用 JavaScript 的 Math.round() 和 .toFixed() 方法时,不同浏览器之间可能会出现问题。在这个网站上研究之后,我看到的批评最少的解决方案是十进制舍入方法,如图at the MDN

查看代码,我被这部分弄糊涂了:

function decimalAdjust(type, value, exp) {
  // If the exp is undefined or zero...
  if (typeof exp === 'undefined' || +exp === 0) {
    return Math[type](value);
  }
  value = +value;
  exp = +exp;
  // If the value is not a number or the exp is not an integer...
  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
    return NaN;
  }
  // Shift
  value = value.toString().split('e');
  value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
  // Shift back
  value = value.toString().split('e');
  return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
}

具体来说,我被“value = value.toString().split('e');”这一行弄糊涂了,它从底部开始出现了大约五行。

据我所知,JavaScript 正在将“值”更改为文本,然后将其拆分为“e”。这个“e”是从哪里来的?每当我在诸如 11.111 之类的浮点数上使用“toString()”方法时,都会得到“11.111”。 'e'是否以某种方式暗示?它是否与字符串一起存储在某个地方?它们真的是“toExponential()”的意思吗?

提前感谢您的任何意见,如果这是一个愚蠢的问题,我深表歉意。如果有人有更可靠的解决方案,请随时为我指明正确的方向。

【问题讨论】:

  • 也许你还没有尝试过1111111111111111111111111111111111111111111111111111.11 上的toString 方法?请参阅ES5, section 9.8.1,第 9 步和第 10 步:“返回由 s 的十进制表示的最高有效位组成的字符串,后跟一个小数点 '.',然后是 s 的十进制表示的剩余 k-1 位,后跟小写字符'e'..."
  • e 用于以科学计数法表示巨大的数字:aaaebbbaaa * 10 ^ (bbb)
  • 我知道如果你输入一个很大的数字,它会吐出一个“e”(我不知道它到底有多大)......但是如果你想舍入一个相对较小的数字?比如1.1111,四舍五入到百分之一?除了 toString() 方法开始使用 'e' 的那个断点之外,这种方法不会无用吗?
  • 在阅读了 apsillers 的评论并浏览了链接,以及查看了下面的 meskobalazs 的答案之后,我已经弄清楚了。非常感谢:)

标签: javascript rounding tostring


【解决方案1】:

e 是科学计数法中的指数符号,当数字真的很大(或很小)时,你会在toString() 中得到它。

例如0.0000000000001 产生1e-13

至于你问题的另一部分:

该方法也适用于没有指数部分的情况。在这种情况下,split 函数返回一个长度为 1 的数组,因此 value[1] 变为 undefined 这是虚假的。在这种情况下,我们基本上忽略它。

【讨论】:

  • 感谢您的回答,但这仍然引出了一个问题——如果您想对较小的数字(即较少的数字)使用十进制舍入怎么办?是不是只有在 toString() 方法发现需要用 'e' 来表示数字时才适用?谢谢:)
  • 好吧,我想我现在明白了。我没有意识到“.split('e')”是一种用于更大表达式的过滤器。再次感谢 - 还不能投票给你,但我已经接受了你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多