【问题标题】:MDN example (of Math.random()): could it be parseInt() instead of Math.floor()?MDN 示例(Math.random()):它可以是 parseInt() 而不是 Math.floor()?
【发布时间】:2015-08-16 19:53:10
【问题描述】:

当我偶然发现Math.random() 的这个示例时,我正在阅读 JavaScript 教程并在 MDN 网站上搜索函数:

function getRandomIntInclusive(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

虽然我知道Math.floor 选择了最大的数字并删除了所有具有十进制值的数字,但我已经学习了另一个名为parseInt() 的函数,它只是删除了点之后的所有数字。那么,这两者有什么区别呢?我不能只使用

function getRandomInclusive(min, max) {
return parseInt(Math.random() * (max - min + 1)) + min;
}

相反? 我在写这个问题时想到Math.floor() 可能会在 4,5 时写 5 而parseInt() 会写 4,但据我所知,这对于随机数生成器并不重要(如果您知道任何时间的示例)重要,请告诉我!)那么,在这种情况下仍然没有太大区别?

【问题讨论】:

    标签: javascript math random


    【解决方案1】:

    parseInt字符串 解析为整数,只读取该字符串开头的数字。不适合使用将数字四舍五入为整数。数字会先转成字符串,有时会出现意想不到的结果:

    var num = 1000000000000000000000;
    parseInt(num) // 1, because the string representation is 1e+21
    

    我在写这个问题时想到 Math.floor() 在 4,5 时可能会写成 5,而 parseInt() 会写成 4

    您正在考虑四舍五入到最接近的整数,这就是 Math.round 所做的。 Math.floor 总是向下取整。

    【讨论】:

    • 伟大的不平凡的例子!
    【解决方案2】:

    明显的区别在于Math.floor 是一个处理数字的函数,而parseInt 是一个接收字符串的函数。您不想在这里使用后者,因为我们处理随机数字

    如果您不确定舍入模式,请比较Math.floorMath.roundMath.ceil

    【讨论】:

    • parseInt 只是将其第一个参数转换为字符串,不一定需要一个 (MDN)。 (尽管我同意以任何其他方式使用它可能是不好的做法)
    • @doldt:是的,当然,但关键是我们不想将数字转换为字符串。我们也不做Math.floor("1.23")(尽管它的工作原理相同并将其参数转换为数字)。
    【解决方案3】:

    这是一个他们的行为截然不同的例子:负数。

    Math.floor(-2.5) -> -3
    parseInt(-2.5) -> -2
    

    但是,其他答案中指出的语义差异可能更重要。即使它确实适用于您的特定用例,最好选择具有正确语义的用例。 (还有无数其他方法可以从函数中返回看似随机的整数,您应该选择最不可能使代码难以维护的方法。)

    【讨论】:

    • 谢谢!但这对随机数生成器有影响吗?据我所知,它不会,所以基本上我可以使用其中任何一个,它会一样好,是吗?
    • @Zyberg 仅仅因为两个解决方案给出了相同的结果,这并不意味着它们同样好。考虑可维护性 - 无论是当您将来必须修改代码时,还是当其他人必须阅读它时。
    • 我明白这一点,在某种程度上这就是我发布这个问题的原因。谢谢你这么详细的回答!
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 2014-05-07
    • 2022-01-22
    • 2016-03-15
    • 2011-04-26
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多