如何获取一个数字的前3位
How do I get the only the first 3 digits of a number?
我有一个数字向量(浮点(,表示某个时间戳的第二个之后的所有内容。它们的长度各不相同。它看起来像这样:
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
相关文章:
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 输出错误,问题是找到总和5000位数字cpp
- 顺时针迭代旋转 3 位数字
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 使用 cin 时接受小数点后的 2 位数字
- 您可以使用 setfill() 来设置 fill 2 位数字吗?
- 斐波那契数列部分和的最后一位数字
- 我需要找到 N 位数字的总和
- 在不添加进位的情况下添加数字的C++程序
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 如何在C ++中替换整数的前两位数字?
- 将最多 50 位数字的 2 个数字相乘
- C++ 中 11 位数字的数字的乘积
- 如何旋转给定数字的位
- 两个数字按位连接
- 作为数字的位的c++列表
- 反转数字的位
- C++:数字与位