⭐ 获取指定范围内的随机数

function fn(min, max) {
  return Math.round(Math.random() * (max - min - 2) + min + 1); // (min, max)
  return Math.round(Math.random() * (max - min) + min); // [min, max]
  return Math.ceil(Math.random() * (max - min) + min); // (min, max]
  return Math.floor(Math.random() * (max - min) + min); // [min, max)
}

参考:JS - 生成随机数的方法汇总(不同范围、类型的随机数)

⭐ 如何检查一个数字是否为整数?

将它对 1 进行取模,看看是否有余数。

function isInt(num) {
  return num % 1 === 0;
}

console.log(isInt(4)); // true
console.log(isInt(12.2)); // false
console.log(isInt(0.3)); // false

或者使用 Number.isInterger()

function isInt(num) {
  return Number.isInteger(num);
}

console.log(isInt(4)); // true
console.log(isInt(12.2)); // false
console.log(isInt(0.3)); // false

⭐ 为什么 0.1+0.2 不等于 0.3 ?在什么场景下遇到这个问题,如何解决?

二进制模拟十进制进行计算时 的精度问题

JavaScript存在精度丢失问题,由于有些小数无法用二进制表示,所以只能取近似值,解决方法有:

// ES6的 Number.EPSILON , 这个值无限接近于0。0.1+0.2的精度误差在这个值的范围内
function numbersEqual(a,b) {
    return Math.abs(a-b)<Number.EPSILON;
}
var a= 0.1 + 0.2, b = 0.3;
console.log(numbersEqual(a,b));    //true

// parseFloat + 内置函数toFixed
function formatNum(num, fixed = 10) {
    // a.toFixed(fixed) 先转为小数点10位的字符串 "0.3000000000"
    return parseFloat(num.toFixed(fixed)) // 然后通过parseFloat转为浮点数
}
var a = 0.1 + 0.2;
console.log(formatNum(a)); //0.3

// 内置函数toPrecision(中文:精确,精度)
// 参数是精度.比如5.1234,传2返回5.1,传1返回5;0.2+0.1传2返回0.30
(0.1 + 0.2).toPrecision(10) == 0.3 // true

封装方法:

function formatMoney(amount, precision = 2) {
  // 确保精度为非负整数
  if (precision < 0 || !Number.isInteger(precision)) {
    throw new Error('Precision must be a non-negative integer');
  }
  
  // 将金额转换为字符串,并根据精度截取小数部分
  const factor = Math.pow(10, precision);
  const formattedAmount = Math.round(amount * factor) / factor;
  
  return formattedAmount.toFixed(precision);
}

// 使用示例
console.log(formatMoney(0.1 + 0.2)); // 输出 "0.30"
console.log(formatMoney(0.1 + 0.2, 3)); // 输出 "0.300"
console.log(formatMoney(1234.5678, 2)); // 输出 "1234.57"
console.log(formatMoney(1234.5678, 0)); // 输出 "1235"