RESUMEN:
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);
}
Por lo tanto, debe encontrar el lugar decimal del primer dígito distinto de cero, luego guardar los siguientes dígitos N-1 y luego redondear el dígito N en función del resto.
Podemos usar log para hacer lo primero.
log 1239451 = 6.09
log 12.1257 = 1.08
log 0.0681 = -1.16
Entonces, para números> 0, tome el techo del registro. Para números <0, tome el piso del registro.
Ahora tenemos el dígito d
: 7 en el primer caso, 2 en el segundo, -2 en el tercero.
Tenemos que redondear el (d-N)
décimo dígito. Algo como:
double roundedrest = num * pow(10, -(d-N));
pow(1239451, -4) = 123.9451
pow(12.1257, 1) = 121.257
pow(0.0681, 4) = 681
Luego haz el redondeo estándar:
roundedrest = (int)(roundedrest + 0.5);
Y deshacer el pow.
roundednum = pow(roundedrest, -(power))
Donde potencia es la potencia calculada anteriormente.
Acerca de la precisión: la respuesta de Pyrolistical está más cerca del resultado real. Pero tenga en cuenta que no puede representar 12.1 exactamente en cualquier caso. Si imprime las respuestas de la siguiente manera:
System.out.println(new BigDecimal(n));
Las respuestas son:
Pyro's: 12.0999999999999996447286321199499070644378662109375
Mine: 12.10000000000000142108547152020037174224853515625
Printing 12.1 directly: 12.0999999999999996447286321199499070644378662109375
Entonces, ¡usa la respuesta de Pyro!