Здесь я предполагаю, что часть интеграл числа с плавающей точкой представляет собой субсекундное значение, так что 1234f
на самом деле составляет 0.1234
секунды. Кажется, именно об этом и говорится в вашем вопросе.
Если это так, мне кажется, вы можете просто непрерывно делить значение на десять, пока не получите что-то меньше единицы. Затем умножьте это на тысячу и округлите. Это будет go что-то вроде:
#include <iostream>
int millis(float value) {
if (value < 0) return -millis(-value);
//while (value >= 1000f) value /= 1000f;
while (value >= 1.0f) value /= 10.f;
return static_cast<int>(value * 1000 + .5f);
}
int main(int argc, char *argv[]) {
for (int i = 1; i < argc; ++i) {
float f= atof(argv[i]);
std::cout << " " << f << " -> " << millis(f) << "\n";
}
}
Я также добавил специальный случай для обработки отрицательного числа и (закомментированный, необязательный) оптимизацию, чтобы быстрее перейти к под-единице для большие числа.
Далее следует стенограмма с вашими примерными значениями:
pax> ./testprog 4456 485926 346
4456 -> 446
485926 -> 486
346 -> 346
Если вместо этого значения уже являются субсекундными числами с плавающей запятой, а вам просто нужно количество миллисекунд, вы делаете то же самое, но без начальных делений:
int millis(float value) {
if (value < 0) return -millis(-value);
return static_cast<int>(value * 1000 + .5f);
}