【数值】生成不重复的随机数、浮点数加减乘除精度丢失

这篇博客详细介绍了JavaScript中生成随机数的方法,包括指定范围内的随机数、指定位数的随机数以及生成不重复随机数的实现。同时,针对浮点数加减乘除可能出现的精度丢失问题,提出了转换为整数运算的解决方案,给出了乘法、除法、加法和减法的具体函数实现,确保计算结果的精确性。
摘要由CSDN通过智能技术生成

生成一个 a 到 b 之间的随机数:

function getRandomNum (n) {
	return Math.floor(Math.random() * (b - a + 1)) + a
}

生成一个 n 位的随机数:

function getRandomNum(n) {
  let num = ''
  for (let i = 0; i < n; i++) {
    num += Math.floor(Math.random() * 10)
  }
  return num
}

console.log(getRandomNum(3)) //  随机生成一个三位的数字

请添加图片描述

生成 0 到 n 之间的不重复随机数:

function getRandomNum (n) {
	let count = n + 1
	
	let arr = []
	for(let i=0; i<count; i++){
		arr[i] = i
	}
	arr.sort(function() {
		return 0.5 - Math.random();
	})

	let result = ''
	for(let i=0; i<count; i++){
		result += arr[i]+ ','
	}
	return result
}

console.log(getRandomNum(5)) // 随机生成 0 到 5 之间的不会重复的数字

请添加图片描述

解决浮点数加减乘除出现的精度丢失问题:

基本思路都是将浮点数转换为整数再进行运算。

乘法:
function toMultiply(num1 = 0, num2 = 0) {
  const s1 = num1.toString()
  const s2 = num2.toString()
  const a1 = s1.split('.')
  const a2 = s2.split('.')
  const d1 = a1.length > 1 ? a1[1].length : 0
  const d2 = a2.length > 1 ? a2[1].length : 0
  return (s1.replace('.', '') * s2.replace('.', '')) / Math.pow(10, (d1 + d2))
}

console.log(toMultiply(1.2,2.23)) // 2.676
console.log(1.2 * 2.23)  // 2.6759999999999997
除法:
function toDivide(num1 = 0, num2 = 0) {
  const s1 = num1.toString()
  const s2 = num2.toString()
  const a1 = s1.split('.')
  const a2 = s2.split('.')
  const d1 = a1.length > 1 ? a1[1].length : 0
  const d2 = a2.length > 1 ? a2[1].length : 0
  return (s1.replace('.', '') / s2.replace('.', '')) / Math.pow(10, (d1 - d2))
}
console.log(toDivide(1.2, 6)) // 0.2
console.log(1.2 / 6) // 0.19999999999999998
加法:
function toIncrement(num1 = 0, num2 = 0) {
  const a1 = num1.toString().split('.')
  const a2 = num2.toString().split('.')
  const d1 = a1.length > 1 ? a1[1].length : 0
  const d2 = a2.length > 1 ? a2[1].length : 0
  const d = Math.pow(10, Math.max(d1, d2))
  return (toMultiply(num1, d) + toMultiply(num2, d)) / d
}
console.log(toIncrement(1.2,2.23)) // 3.43
console.log(1.2 + 2.23) // 3.4299999999999997
减法:
function toSubtract(num1 = 0, num2 = 0) {
  const a1 = num1.toString().split('.')
  const a2 = num2.toString().split('.')
  const d1 = a1.length > 1 ? a1[1].length : 0
  const d2 = a2.length > 1 ? a2[1].length : 0
  const d = Math.pow(10, Math.max(d1, d2))
  return (toMultiply(num1, d) - toMultiply(num2, d)) / d
}
console.log(toSubtract(0.3, 0.1)) // 0.2
console.log(0.3 - 0.1) // 0.19999999999999998
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值