使用附近0.05的自定义舍入数字



我想在下面的数字上汇总数字,我已经在6个月之前在堆栈溢出中问了一个问题,我得到了解决方案,而且工作正常

12.910 - 12.90
12.920 - 12.90
12.930 - 12.90
12.940 - 12.90
12.941 - 12.95
12.950 - 12.95
12.960 - 12.95
12.970 - 12.95
12.980 - 12.95
12.990 - 12.95
12.991 - 13.00 
13.000 - 13.00 

,但它不适用于以下数字

Input 32.34 - expected 32.30 - but got 32.35
Input 33.09 - expected 33.05 - but got 33.10

虽然其他数字(例如33.34 , 23.34)给出了正确的输出33.30 and 23.30

这是功能

function customRound(num) {
     intermediateResult = Math.ceil(num*100)/100;
     return Math.floor(intermediateResult*20)/20;
}

我认为您要在执行num * 100后将其转到最近的整数。现在,您将使用Math.ceil.

将其舍入下一个整数

尝试使用Math.round。我希望它有帮助:

更新:您还必须将toFixedparseFloat一起使用以在乘法中解决精度错误。

function customRound(num) {
  intermediateResult = Math.round(parseFloat((num * 100).toFixed(2))) / 100;
  return Math.floor(intermediateResult * 20) / 20;
}
console.log(customRound(32.34));
console.log(customRound(33.09));
console.log(customRound(67.445));
console.log(customRound(69.195));

如果要显示2个小数点位置,请将toFixedparseFloat一起使用,例如: parseFloat(Math.round(res * 100) / 100).toFixed(2)

function customRound(num) {
  intermediateResult = Math.round(parseFloat((num * 100).toFixed(2))) / 100;
  const res = Math.floor(intermediateResult * 20) / 20;
  return parseFloat(Math.round(res * 100) / 100).toFixed(2)
}
console.log(customRound(32.34));
console.log(customRound(33.09));
console.log(customRound(67.445));
console.log(customRound(57.244));


第二个更新:

function getIntString(num, factor = 1) {
  return (num * factor + "").split('.')[0];
}
function customRound(num) {
  const int = getIntString(num);
  const decimal = (num + "").split('.')[1];
  let precision;
  if (decimal) {
    if (decimal.length === 2) {
      precision = decimal + 0;
    } else {
      precision = decimal.slice(0, 3);
    }
  } else {
    return num;
  }
  const specificPrecision = precision.slice(1);
  if (specificPrecision > 40 && specificPrecision < 91) {
    precision = precision.slice(0, 1) + 50;
    return parseFloat(`${int}.${precision}`);
  } else if (specificPrecision >= 91) {
    if (parseInt(precision.slice(0, 1)) === 9) {
      return Math.ceil(num);
    } else {
      return (Math.floor(num * 10 + 1))/10;
    }
  } else {
    return parseInt(getIntString(num, 10)) / 10;
  }
}
const logResult = (inp) => `Input: ${inp}, Result: ${customRound(inp)}`;
console.log(logResult(18.095));
console.log(logResult(12.991));
console.log(logResult(12.191));
console.log(logResult(12.990));
console.log(logResult(12.910));
console.log(logResult(12.440));
console.log(logResult(12.441));
console.log(logResult(12.921));
console.log(logResult(67.445));
console.log(logResult(57.244));
console.log(logResult(58.344));
console.log(logResult(69.195));

最新更新