Есть ли эквивалент для toPrecision () в Java?
При переносе алгоритма с JavaScript на Java я столкнулся с проблемой, что мне нужна замена toPrecision () в JavaScript. Проблема в том, что я понятия не имею, насколько малыми или большими будут числа, поэтому я не могу использовать простой NumberFormat с правильным форматом.
Есть ли стандартный класс, который предлагает аналогичную функциональность?
РЕДАКТИРОВАТЬ Вот что я придумал:
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.exp((e-p+1)*Math.log(10));
return Math.round(n/f)*f;
}
В принципе, это правильно, но ошибки округления полностью разрушают его. Например,
toPrecision(12.34567, 3)
возвращается12.299999999999997
РЕДАКТИРОВАТЬ 2 Эта версия отлично работает для 11 из 12 тестовых случаев ...
double toPrecision(double n, double p) {
if (n==0) return 0;
double e = Math.floor(Math.log10(Math.abs(n)));
double f = Math.round(Math.exp((Math.abs(e-p+1))*Math.log(10)));
if (e-p+1<0) {
f = 1/f;
}
return Math.round(n/f)*f;
}
НоtoPrecision(0.00001234567, 3)
все еще возвращается1.2299999999999999E-5
вместо1.23E-5