总结:
double roundit(double num, double N)
{
double d = log10(num);
double power;
if (num > 0)
{
d = ceil(d);
power = -(d-N);
}
else
{
d = floor(d);
power = -(d-N);
}
return (int)(num * pow(10.0, power) + 0.5) * pow(10.0, -power);
}
所以你需要找到第一个非零位的小数位,然后保存接下来的N-1位,然后根据其余的四舍五入。
我们可以使用 log 来做第一个。
log 1239451 = 6.09
log 12.1257 = 1.08
log 0.0681 = -1.16
所以对于 > 0 的数字,取对数的上限。对于
现在我们有了数字d:第一种情况是7,第二种情况是2,第三种情况是-2。
我们必须将(d-N)th 数字四舍五入。比如:
double roundedrest = num * pow(10, -(d-N));
pow(1239451, -4) = 123.9451
pow(12.1257, 1) = 121.257
pow(0.0681, 4) = 681
然后做标准的四舍五入:
roundedrest = (int)(roundedrest + 0.5);
然后撤消战俘。
roundednum = pow(roundedrest, -(power))
其中power是上面计算的功率。
关于准确性:Pyrolistical 的回答确实更接近真实结果。但请注意,在任何情况下您都不能准确地表示 12.1。如果您将答案打印如下:
System.out.println(new BigDecimal(n));
答案是:
Pyro's: 12.0999999999999996447286321199499070644378662109375
Mine: 12.10000000000000142108547152020037174224853515625
Printing 12.1 directly: 12.0999999999999996447286321199499070644378662109375
所以,使用火焰兵的答案!