js处理小数加减乘除浮点问题

	/**
	 * @name 检测数据是否超限
	 * @param {Number} number
	 */
	export const checkSafeNumber = number => {
	  if (number > Number.MAX_SAFE_INTEGER || number < Number.MIN_SAFE_INTEGER) {
	    console.log(`数字 ${number} 超限,请注意风险!`);
	  }
	};
	
	/**
	 * @name 修正数据
	 * @param {Number} number 需要修正的数字
	 * @param {Number} precision 端正的位数
	 */
	export const revise = (number, precision = 12) => {
	  return +parseFloat(number.toPrecision(precision));
	};
	
	/**
	 * @name 获取小数点后面的长度
	 * @param {Number} 需要转换的数字
	 */
	export const digitLength = number => {
	  // 判断是否为小数
	  let result = number.toString().indexOf(".");
	  if (result != -1) {
	    return number.toString().split(".")[1].length;
	  }
	  return 0;
	};
	
	/**
	 * @name 将数字的小数点去掉
	 * @param {Number} 需要转换的数字
	 */
	export const floatToInt = number => {
	  return Number(number.toString().replace(".", ""));
	};
	
	/**
	 * @name 精度计算乘法
	 * @param {Number} arg1 乘数 1
	 * @param {Number} arg2 乘数 2
	 */
	export const multiplication = (arg1, arg2) => {
	  const baseNum = digitLength(arg1) + digitLength(arg2);
	  const result = floatToInt(arg1) * floatToInt(arg2);
	  checkSafeNumber(result);
	  return result / Math.pow(10, baseNum);
	  // 整数安全范围内的两个整数进行除法是没问题的
	  // 如果有,证明给我看
	};
	
	/**
	 * @name 精度计算加法
	 * @description JavaScript 的加法结果存在误差,两个浮点数 0.1 + 0.2 !== 0.3,使用这方法能去除误差。
	 * @param {Number} arg1 加数 1
	 * @param {Number} arg2 加数 2
	 * @return arg1 + arg2
	 */
	export const add = (arg1, arg2) => {
	  const baseNum = Math.pow(10, Math.max(digitLength(arg1), digitLength(arg2)));
	  return (
	    (multiplication(arg1, baseNum) + multiplication(arg2, baseNum)) / baseNum
	  );
	};
	
	/**
	 * @name 精度计算减法
	 * @param {Number} arg1 减数 1
	 * @param {Number} arg2 减数 2
	 */
	export const subtraction = (arg1, arg2) => {
	  const baseNum = Math.pow(10, Math.max(digitLength(arg1), digitLength(arg2)));
	  return (
	    (multiplication(arg1, baseNum) - multiplication(arg2, baseNum)) / baseNum
	  );
	};
	
	/**
	 * @name 精度计算除法
	 * @param {Number} arg1 除数 1
	 * @param {Number} arg2 除数 2
	 */
	export const division = (arg1, arg2) => {
	  const baseNum = Math.pow(10, Math.max(digitLength(arg1), digitLength(arg2)));
	  return multiplication(arg1, baseNum) / multiplication(arg2, baseNum);
	};
	
	/**
	 * @name 按指定位数四舍五入
	 * @param {Number} number 需要取舍的数字
	 * @param {Number} ratio 精确到多少位小数
	 */
	export const round = (number, ratio) => {
	  const baseNum = Math.pow(10, ratio);
	  return division(Math.round(multiplication(number, baseNum)), baseNum);
	  // Math.round() 进行小数点后一位四舍五入是否有问题,如果有,请证明出来
	  // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round
	};

你可能感兴趣的:(js处理小数加减乘除浮点问题)