ZUSAMMENFASSUNG:
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);
}
Sie müssen also die Dezimalstelle der ersten Ziffer ungleich Null ermitteln, dann die nächsten N-1-Ziffern speichern und dann die N-te Ziffer basierend auf dem Rest runden.
Wir können log verwenden, um das erste zu tun.
log 1239451 = 6.09
log 12.1257 = 1.08
log 0.0681 = -1.16
Nehmen Sie für Zahlen> 0 die Obergrenze des Protokolls. Nehmen Sie für Zahlen <0 das Wort des Protokolls.
Jetzt haben wir die Ziffer d
: 7 im ersten Fall, 2 im 2., -2 im 3 ..
Wir müssen die (d-N)
dritte Ziffer runden . Etwas wie:
double roundedrest = num * pow(10, -(d-N));
pow(1239451, -4) = 123.9451
pow(12.1257, 1) = 121.257
pow(0.0681, 4) = 681
Dann machen Sie die Standardrundung:
roundedrest = (int)(roundedrest + 0.5);
Und mache den Powder rückgängig.
roundednum = pow(roundedrest, -(power))
Wobei Leistung die oben berechnete Leistung ist.
Über Genauigkeit: Die Antwort von Pyrolistical ist in der Tat näher am tatsächlichen Ergebnis. Beachten Sie jedoch, dass Sie 12.1 auf keinen Fall genau darstellen können. Wenn Sie die Antworten wie folgt drucken:
System.out.println(new BigDecimal(n));
Die Antworten sind:
Pyro's: 12.0999999999999996447286321199499070644378662109375
Mine: 12.10000000000000142108547152020037174224853515625
Printing 12.1 directly: 12.0999999999999996447286321199499070644378662109375
Verwenden Sie also Pyros Antwort!