РЕЗЮМЕ:
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 цифри, а потім округлити N-ю цифру на основі решти.
Ми можемо використовувати журнал, щоб зробити перший.
log 1239451 = 6.09
log 12.1257 = 1.08
log 0.0681 = -1.16
Отже, для чисел> 0 візьмемо границю журналу. Для цифр <0 візьміть слово журналу.
Тепер у нас цифра d
: 7 у першому випадку, 2 у другому, -2 у третьому.
Ми повинні округлити (d-N)
ту цифру. Щось на зразок:
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))
Де потужність - це потужність, розрахована вище.
Про точність: відповідь Піролістіка справді ближча до реального результату. Але зауважте, що ви не можете представляти 12.1 точно в будь-якому випадку. Якщо ви роздрукуєте відповіді наступним чином:
System.out.println(new BigDecimal(n));
Відповіді такі:
Pyro's: 12.0999999999999996447286321199499070644378662109375
Mine: 12.10000000000000142108547152020037174224853515625
Printing 12.1 directly: 12.0999999999999996447286321199499070644378662109375
Отже, використовуйте відповідь Піро!