【问题标题】:Generate a Random Number between 2 values to 2 decimals places in Javascript在Javascript中生成2个值到2个小数位之间的随机数
【发布时间】:2018-01-25 21:21:55
【问题描述】:

我想生成一个介于 1 到 10 之间的随机数,最多保留 2 个小数位,

我目前正在使用下面的这个来生成我的号码,

var randomnum = Math.floor(Math.random() * (10.00 - 1.00 + 1.00)) + 1.00;

最后,我想知道如何生成数字,例如:

1.66

5.86

8.34

格式为:var randomnum = 然后是代码

旁注:我不记得我以前为什么生成这样的数字,但记得 Math.random 生成数字到小数点后 8 位。

感谢您的帮助! :)

Ps:我看过很多关于等待向下或向上舍入生成的数字的帖子,但没有找到想要直接生成它们的帖子。

更新:我想要一个数字值而不是看起来像数字的字符串

【问题讨论】:

  • JavaScript 中的数字具有它们所具有的精度;尝试将精度限制在小数点后两位没有多大意义。您可以做的是生成 1 到 1000 之间的 整数,然后将它们除以 100,但由于二进制浮点的性质,您最终仍会在小数部分中出现一些“模糊”值。
  • 您可以使用 parseFloat 转换它。有什么问题?
  • 我提供的链接有创建随机十进制数的解决方案,这是您的要求。所以你只需要使用 parseFloat() 转换字符串。这就是你所要做的。
  • 我该怎么做?

标签: javascript random


【解决方案1】:

您非常接近,您需要的是不要将十进制数作为最小值和最大值。让我们有 max = 1000 和 min = 100,所以在 Math.floor 之后,您需要除以 100:

var randomnum = Math.floor(Math.random() * (1000 - 100) + 100) / 100;

或者如果您想使用小数:

var precision = 100; // 2 decimals
var randomnum = Math.floor(Math.random() * (10 * precision - 1 * precision) + 1 * precision) / (1*precision);

【讨论】:

  • 我把它与我的网站配合得最好,所以谢谢你,“关闭但没有雪茄”
  • 如果我想改变这个等式:是吗? var randomnum = Math.floor(Math.random() * (max - min) + min) / 100;
  • 100 是小数点后两位的精度。查看更新后的帖子
【解决方案2】:

将原始随机数乘以10^decimalPlaces,取底,然后除以10^decimalPlaces。例如:

floor(8.885729840652472 * 100) / 100  // 8.88

function genRand(min, max, decimalPlaces) {  
    var rand = Math.random()*(max-min) + min;
    var power = Math.pow(10, decimalPlaces);
    return Math.floor(rand*power) / power;
}

for (var i=0; i<20; i++) {
  document.write(genRand(0, 10, 2) + "<br>");
}

编辑以响应 cmets
对于包含浮点随机函数(使用this answer):

function genRand(min, max, decimalPlaces) {  
    var rand = Math.random() < 0.5 ? ((1-Math.random()) * (max-min) + min) : (Math.random() * (max-min) + min);  // could be min or max or anything in between
    var power = Math.pow(10, decimalPlaces);
    return Math.floor(rand*power) / power;
}

【讨论】:

  • 这很好,但genRand(2, 4, 1) 永远不会返回 4.0。您需要在末尾添加一个修饰符,具体取决于max(如果 max
  • @thdoan 是的,上限是独占的。您能否详细说明如何使其具有包容性?
  • clabe45,我正要提交自己的解决方案,直到遇到this solution,所以我要继续使用它(为什么要重新发明轮子,对吧?:))。
  • @thdoan 谢谢,不过我不知道这与我的解决方案有何不同,因为我认为不需要Math.min
  • clabe45,不同的是我链接到的那个是 4.0 :)。
【解决方案3】:

您可以使用以下代码。

var randomnum = (Math.random() * (10.00 - 1.00 + 1.00) + 1.00).toFixed(2);

【讨论】:

    【解决方案4】:

    只是为了根据上面的例子在视觉上、数学上和功能上简化事情。

    function randomNumberGenerator(min = 0, max = 1, fractionDigits = 0, inclusive = true) {
      const precision = Math.pow(10, Math.max(fractionDigits, 0));
      const scaledMax = max * precision;
      const scaledMin = min * precision;
      const offset = inclusive ? 1 : 0;
      const num = Math.floor(Math.random() * (scaledMax - scaledMin + offset)) + scaledMin;
    
      return num / precision;
    };
    

    Math.max 防止来自fractionDigits 的负小数位

    【讨论】:

      【解决方案5】:

      typescript/angular 示例的更多方式:

      getRandom(min: number, max: number) {
        return Math.random() * (max - min) + min;
      }
      
      console.log('inserting min and max values: ', this.getRandom(-10.0, -10.9).toPrecision(4));
      

      获取介于 -10.0 和 -10.9 之间的随机值

      【讨论】:

        【解决方案6】:

        这是另一种尚未提及的方式,它将生成一个介于 1 和 9.99 之间的随机数...

        (Math.random() * 8 + 1 + Math.random()).toFixed(2)

        console.log((Math.random() * 8 + 1 + Math.random()).toFixed(2))

        这是否是最实用的方法完全是另一个问题。

        【讨论】:

        • 所以这会返回一个字符串。您可以使用typeof 进行检查。为了让它工作,在它周围包裹一个 parseFloat() 以便输出变成一个数字。
        【解决方案7】:

        一个简单的 javascript 示例,用于生成精确的随机数:

        function genRand(min, max, decimalPlaces) {
            return (Math.random() * (max - min) + min).toFixed(decimalPlaces) * 1;
        }
        
        console.log(genRand(-5, 5, 2));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-10
          • 2019-05-24
          • 2015-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-19
          • 1970-01-01
          相关资源
          最近更新 更多