JS中Math

为什么写这个文章源头:

  • 做力扣题的时候被屈辱了,突然忘了Math.floor(Math.random()10)+10,就是Math.random()得到一个0-1的随机数(小数也包括)然后10,也就是得到一个0-10的随机数,Math.floor向下取整不超过这个数的最大整数,(说白了就是取这个数的整数,不要小数部分)
    然后加上10,也就是10-20的一个整数

废话不多说,话说张哥直接开讲

基础数学对象Math属性值

在这里插入图片描述

数学对象Math之方法(取最大, 最小值)

  • Math
    对象还包含许多方法,用于辅助完成简单和复杂的数学计算。其中min()和max()方法用于确定一组数值中的最小值和最大值。这两个方法都可以接收任意多个数值参数
   let min=Math.min(2,34,2,1)
   let max=Math.max(2,34,2,1)
   console.log("最小值是:",min);
   console.log("最大值是:",max);

在这里插入图片描述
那么我们想想是不是可以用来求数组的最大值最小值?

   let arr=[12,2,1,3]
   let max=Math.max(arr)
   console.log(max);

在这里插入图片描述
Math.max()里边不能传入数组,但是数组就比我们平时传入的参数多了两个[ ],我们会想到apply(调用对象,数组参数[])但是最后传入的是数组参数是去掉方括号后里边的内容,不正是我们想要的吗?

   let arr=[12,2,1,3]
   let max=Math.max.apply(null,arr)
   console.log(max);

在这里插入图片描述
我刚开始想这个问题的时候,直接想的是把方括号去掉,用正则表达式,离谱了就跑远了。。这个方法多好哈哈哈,我low了

数学对象Math之方法(取整)

Math.floor():向下取整,不超过其最大整数(就是取一个数的整数部分)
Math.ceil():向上取整,超过其最小整数(就是一个数字的整数部分+1)
Math.round():四舍五入
不再演示了,看一眼记住用即可

数学对象Math之方法(取随机数)

Math.random()方法返回大于等于0 小于1 的一个随机数

改装一下,改成任意两个数字之间的随机数

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

上图解释一下

在这里插入图片描述

继续改装,改成任意两个数字之间的整数

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

看起来很简单对不对?但是这是我们自己很默认的把输入的两个任意数字取了3,4这样有间距的,如果取2.5和3呢?5,2?
在这里插入图片描述

2.5和3之间的整数是2?我滴个乖乖颠覆价值观呀。小学白上了。
在这里插入图片描述

也就是说我们需要分开讨论

  • 首先判断两个数字是否存在(也就是是否输入了两个值)
  • 判断max和min的关系?①max==min考虑2.2和2.2 ②max>min,考虑2.2,2.1情况,2.2,1的情况 ③min>max
  • 不同条件下分开考虑写不同的算法
  function getNum(num1, num2) {
      if (num1 === null || num2 === null) {
        return "请输入两个值";
      }
      
      let min = Math.min(num1, num2)
      let max = Math.max(num1, num2)

      if (max == min) {
        if (max == Math.ceil(max)) {
          //情形一:相同的整数例如:2和2
          return max
        }
        else if (Math.floor(max) < max) {
          //情形二:小数情形:2.2和2.2
          return null
        }

      }
      else if (max > min) {
         // 情形一:在两个相邻整数区间且都是小数2.2,2.5
        if(Math.ceil(max)===Math.ceil(min)){
          return null
        }
        else if(Math.floor(max)===Math.ceil(min)){
          // 情形二:在两个相邻整数区间,且有一个为整数2.3, 3
          return Math.floor(max)
        }
        else{
          // 情形三:存在小数,但不在两个相邻整数的区间
          return Math.floor(Math.random()*(max-Math.ceil(min))+Math.ceil(min))
        }
      }
      else{
// min>min的情况
        return "请输入正确的区间,不存在此区间";
      }
    }
    console.log(getNum(2,2));
    console.log(getNum(2.2,2.2));
    console.log(getNum(2.2,2.5));
    console.log(getNum(2.3,3));
    console.log(getNum(2.2,4));
    console.log(getNum(2.2,2));

在这里插入图片描述
确实心累,不过考虑问题要全面
在这里插入图片描述
记住即可,给我背,往死里背哈哈哈,当然多写几个算法才是记忆深刻,要记在思想里,不要记在嘴里,学会运用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值