Быстрый способ преобразовать 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 шт):

Автор решения: Harry

Не знаю, как там на 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;

Надеюсь, при умножении накопления погрешности нет? :)

→ Ссылка
Автор решения: LShadow77

Я тоже не спец в 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;
}
→ Ссылка
Автор решения: Vadik

Решение без циклов, с помощью математических функций 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();
    }
}
→ Ссылка