如何获取一个数字的前3位

How do I get the only the first 3 digits of a number?

本文关键字:数字 3位 一个 何获取 获取      更新时间:2023-10-16

我有一个数字向量(浮点(,表示某个时间戳的第二个之后的所有内容。它们的长度各不相同。它看起来像这样:

4456

485926

346

分别表示0.4456、0.485926和0.346秒。我需要将每个值转换为毫秒,但我不能简单地将每个值乘以某个常数,因为它们的长度都不同。我对失去准确性很满意,我只需要前3位(毫秒位(。如何做到这一点?

试试这个:

#include <iostream>
#include <string>
using namespace std;
int getFirstThreeDigits(int number){
return stoi(to_string(number).substr(0,3));
}
int main()
{
float values[] = {4456, 485926, 346};
int arrLength = (sizeof(values)/sizeof(*values));
for( int i = 0 ; i < arrLength ; i++){
cout << getFirstThreeDigits(values[i]) << endl;
}
}

这里我假设浮点的积分部分表示一个亚秒值,因此1234f实际上是0.1234秒。这似乎就是你的问题所说的。

如果是这样的话,在我看来,你可以不断地把这个值除以10,直到你得到小于1的值。然后乘以一千并取整。这将类似于:

#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";
}
}

我还放入了一个特殊情况来处理负数,并进行了(注释掉,可选(优化,以更快地处理较大数字的子1。

下面是你的示例值:

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);
}

使用"(int(log10+1";是获取整数位数的简单方法

auto x = 485926;
auto len = (int)std::log10(x) + 1;

https://godbolt.org/z/v1jz7P