我想近似计算这个函数的平方根。Math.sqrt(float); 结果应该是另一个浮点数,小数点后最多有6或7位。 使用标准的Math.sqrt(float),我得到了一个非常大的数字,比如0.343423409554534598959,对我来说太多了。
我想近似计算这个函数的平方根。Math.sqrt(float); 结果应该是另一个浮点数,小数点后最多有6或7位。 使用标准的Math.sqrt(float),我得到了一个非常大的数字,比如0.343423409554534598959,对我来说太多了。
如果您只想得到一个更小且更易管理的数字,可以使用toFixed
方法,如下所示:
var x = 0.343423409554534598959;
console.log( x.toFixed(3) )
// outputs 0.343
如果你不想计算完整的平方根,只是想舍弃掉一些数字精度,那么可以使用近似方法。不过要注意,过早优化是万恶之源;而KISS原则与此相反。
这里介绍Heron's方法:
function sqrt(num) {
// Create an initial guess by simply dividing by 3.
var lastGuess, guess = num / 3;
// Loop until a good enough approximation is found.
do {
lastGuess = guess; // store the previous guess
// find a new guess by averaging the old one with
// the original number divided by the old guess.
guess = (num / guess + guess) / 2;
// Loop again if the product isn't close enough to
// the original number.
} while(Math.abs(lastGuess - guess) > 5e-15);
return guess; // return the approximate square root
};
function round (value, precision, mode)
{
precision |= 0; // making sure precision is integer
var m = Math.pow(10, precision);
value *= m;
var sgn = (value > 0) | - (value < 0); // sign of the number
var isHalf = value % 1 === 0.5 * sgn;
var f = Math.floor(value);
if (isHalf)
switch (mode) {
case 'PHP_ROUND_HALF_DOWN':
value = f + (sgn < 0); // rounds .5 toward zero
break;
case 'PHP_ROUND_HALF_EVEN':
value = f + (f % 2 * sgn); // rouds .5 towards the next even integer
break;
case 'PHP_ROUND_HALF_ODD':
value = f + !(f % 2); // rounds .5 towards the next odd integer
break;
default:
value = f + (sgn > 0); // rounds .5 away from zero
}
return (isHalf ? value : Math.round(value)) / m;
}
(double)Math.round(float * Math.pow(10,r)) /Math.pow(10,r);
其中,r
是我们想要在小数点后打印的数字。
尝试像这样编写程序
float f = 0.123f;
double d = Math.sqrt(f);
d = (double)Math.round(d * Math.pow(10,5)) /Math.pow(10,5);
System.out.println(d);
输出:0.35071