Javascript - 将浮点数四舍五入到最接近的非零数字的最有效方法
Javascript - Most efficient way to round off float to nearest non-zero number
我想用(至少)2 位有效数字对 Javascript 中的浮点数进行四舍五入。
例如,具有以下预期结果:
roundOff(0.000000001124) // 0.0000000011 or 1.1e-9 (both acceptable)
roundOff(1.423421) // 1.42
roundOff(0.00053245) // 0.00053
roundOff(422.243224) // 422.24
roundOff(422.0000000123) // 422.00
我知道我可以使用对数和舍入来做与提到的类似的事情 ,但它会舍入更大的数字,例如 -123.0 -> -100
。
有什么聪明的基于 Javascript 的解决方案吗?
以下函数在“.”后的 2 位有效数字后立即舍入给定数字。出现。它执行输入验证并根据第三个有效数字舍入第二个有效数字。
function roundOff(number) {
var temp = "" + number,
counterTwoFigures = 0,
roundedNumber = '',
startingIndex = temp.indexOf('.'),
maxDecimalsAllowance = 20,
multiplier = 100,
minimumThreshold = 1;
if(number * multiplier < minimumThreshold) {
temp = parseFloat(temp).toFixed(maxDecimalsAllowance);
}
if(isNaN(number)){
return undefined;
}
if(startingIndex === -1) {
return number;
}
roundedNumber = temp.substring(0, startingIndex);
for(var i = startingIndex, len = temp.length; i < len; i++){
if((parseFloat(temp[i]) > 0)) {
counterTwoFigures++;
}
if(counterTwoFigures > 2){
if(temp[i] >= 5) {
var updateNumber = "" + (parseFloat(roundedNumber[roundedNumber.length-1]) + 1);
var positionToUpdate = roundedNumber.length-2;
var initialString = roundedNumber.substr(0, roundedNumber.length - 1);
roundedNumber = initialString + updateNumber;
break;
} else {
break;
}
}
roundedNumber += temp[i];
}
return parseFloat(roundedNumber);
}
var a = new Array(0.000000001124, 1.423421, 0.00053245, 422.243224,
422.0000000123, 123, -123, 0.687);
for (i=0; i<a.length; i++) console.log('Input: ' + a[i] + ', Output: ' + roundOff(a[i]));
如果我没理解错的话,你想要一个函数,对于绝对值小于 1 的数字,returns 两位有效数字,或者对于绝对值大于 1 的数字,两位小数。
我还是不明白为什么你认为 0.000000001124
应该四舍五入为 0.0000000012
。您是想改写 0.0000000011
吗?
如果是这样,这个函数应该做你想做的:
function roundOff(n) {
return parseFloat(n.toExponential(Math.max(1,2+Math.log10(Math.abs(n)))));
}
示例:
var a = new Array(0.000000001124, 1.423421, 0.00053245, 422.243224,
422.0000000123, 123, -123);
for (i=0; i<7; i++) console.log(roundOff(a[i]));
输出:
1.1e-9
1.42
0.00053
422.24
422
123
-123
我想用(至少)2 位有效数字对 Javascript 中的浮点数进行四舍五入。
例如,具有以下预期结果:
roundOff(0.000000001124) // 0.0000000011 or 1.1e-9 (both acceptable)
roundOff(1.423421) // 1.42
roundOff(0.00053245) // 0.00053
roundOff(422.243224) // 422.24
roundOff(422.0000000123) // 422.00
我知道我可以使用对数和舍入来做与提到的类似的事情 -123.0 -> -100
。
有什么聪明的基于 Javascript 的解决方案吗?
以下函数在“.”后的 2 位有效数字后立即舍入给定数字。出现。它执行输入验证并根据第三个有效数字舍入第二个有效数字。
function roundOff(number) {
var temp = "" + number,
counterTwoFigures = 0,
roundedNumber = '',
startingIndex = temp.indexOf('.'),
maxDecimalsAllowance = 20,
multiplier = 100,
minimumThreshold = 1;
if(number * multiplier < minimumThreshold) {
temp = parseFloat(temp).toFixed(maxDecimalsAllowance);
}
if(isNaN(number)){
return undefined;
}
if(startingIndex === -1) {
return number;
}
roundedNumber = temp.substring(0, startingIndex);
for(var i = startingIndex, len = temp.length; i < len; i++){
if((parseFloat(temp[i]) > 0)) {
counterTwoFigures++;
}
if(counterTwoFigures > 2){
if(temp[i] >= 5) {
var updateNumber = "" + (parseFloat(roundedNumber[roundedNumber.length-1]) + 1);
var positionToUpdate = roundedNumber.length-2;
var initialString = roundedNumber.substr(0, roundedNumber.length - 1);
roundedNumber = initialString + updateNumber;
break;
} else {
break;
}
}
roundedNumber += temp[i];
}
return parseFloat(roundedNumber);
}
var a = new Array(0.000000001124, 1.423421, 0.00053245, 422.243224,
422.0000000123, 123, -123, 0.687);
for (i=0; i<a.length; i++) console.log('Input: ' + a[i] + ', Output: ' + roundOff(a[i]));
如果我没理解错的话,你想要一个函数,对于绝对值小于 1 的数字,returns 两位有效数字,或者对于绝对值大于 1 的数字,两位小数。
我还是不明白为什么你认为 0.000000001124
应该四舍五入为 0.0000000012
。您是想改写 0.0000000011
吗?
如果是这样,这个函数应该做你想做的:
function roundOff(n) {
return parseFloat(n.toExponential(Math.max(1,2+Math.log10(Math.abs(n)))));
}
示例:
var a = new Array(0.000000001124, 1.423421, 0.00053245, 422.243224,
422.0000000123, 123, -123);
for (i=0; i<7; i++) console.log(roundOff(a[i]));
输出:
1.1e-9
1.42
0.00053
422.24
422
123
-123