Быстрый способ преобразовать int 123 в double 0.123
Нужен максимально быстрый способ превращать целые числа в десятичную дробь с нулём целых. Например, есть целое число 1394, мне нужно преобразовать его в 0.1394.
Единственное, что пришло на ум — это такой способ:
int in = 1394;
int multipler = 1;
for (int i = String.valueOf(in).length(); i > 0; i--) {
multipler = multipler * 10;
}
double result = (double) in / multipler;
Не хочу это использовать, но это то, что выдаёт необходимый результат.
Ответы (3 шт):
Не знаю, как там на Java, но на C/C++ можно такой, может, не самый эффективный, способ:
double x = 12345;
while( x >= 1) x/=10;
Specially for Alex Rudenko:
double x = 12345, y = x, t = 1;
while( y >= 1) { y /= 10; t *= 10; }
x /= t;
Надеюсь, при умножении накопления погрешности нет? :)
Я тоже не спец в Java, по-этому также приведу свой вариант на C++. Производительность этого кода O(1), слабое место - функция log10() (не знаю, насколько она быстра, но всё же лучше, чем цикл).
#define INT_BITS (sizeof(int)<<3)
bool g_bTenPowsInitialized = false;
double g_TenPows[INT_BITS];
void init_ten_pows()
{
if (!g_bTenPowsInitialized)
{
double pw = 1.0;
for (int i=0; i<INT_BITS; ++i)
{
pw*= 0.1;
g_TenPows[i] = pw;
}
g_bTenPowsInitialized = true;
}
}
double int_to_frac(int num)
{
init_ten_pows();
if (num>0) return num*g_TenPows[(int)log10(num)];
if (num<0) return num*g_TenPows[(int)log10(-num)];
return 0.0;
}
Решение без циклов, с помощью математических функций Math.log10 и Math.pow:
private double convert(int integer) {
if (integer < 0) throw new ArithmeticException();
if (integer == 0) return 0;
double log = floor(log10(integer));
double pow = pow(10, log + 1);
return integer / pow;
}
Проверил с помощью BigDecimal на всех числах до 100 000 000:
for (int i = 0; i < 100_000_000; i++) {
double expected = new BigDecimal("0." + i).doubleValue();
if (convert(i) != expected) {
throw new RuntimeException();
}
}