我想在下面的数字上汇总数字,我已经在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
。我希望它有帮助:
更新:您还必须将toFixed
与parseFloat
一起使用以在乘法中解决精度错误。
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个小数点位置,请将toFixed
与parseFloat
一起使用,例如: 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));