文章目录
1 问题描述
C++ vector<double> L_Width;
float[] LWidth;
LWidth[i] = (float)L_Width[i];
在代码中double型数组转换为float数组,转换后的float数组只精确到了小数点后3位,为什么?,
那么怎么控制转换后的宽度呢? 我想精确到小数点后5位
vector<double> L_Width;
for (int i = 0; i < L_Width.size(); i++)
{
LWidth[i] = (float)L_Width[i];
cout << "cam1:" << LWidth[i] << endl;
}
进过调试发现vector L_Width中数据依次为:
L_Width[0]=0.882000029,
L_Width[1]=0.867999971,
L_Width[2]=0.889999986,
LWidth[3]=0.833999991;
而 float[] LWidth数据依次为:
0.882,0.868,0.89,0.834
2 问题分析 及 解决
在C++中,可以使用std::setprecision()来控制浮点数的输出精度。但是, 对于类型转换操作,你无法直接控制转换后的精度
。转换操作会根据目标类型的规则来执行,通常情况下,会按照C++中float类型的默认精度进行截断。
如果你需要将double类型转换为float类型并且控制精度,可以手动进行四舍五入或者截断操作
。下面是一个简单的示例,演示了如何将double类型的数据转换为float类型,并控制精度到小数点后5位:
#include <iostream>
#include <iomanip>
#include <cmath> // 包含round函数的头文件
int main() {
// 假设有一个 double 类型的数组 L_Width
std::vector<double> L_Width = {3.1415926535, 2.7182818284, 1.6180339887};
// 创建一个 float 类型的数组,用于存储转换后的数据
std::vector<float> LWidth_float(L_Width.size());
// 手动进行精度控制
for (size_t i = 0; i < L_Width.size(); ++i) {
// 将 double 类型数据转换为 float 类型并控制精度到小数点后5位
LWidth_float[i] = static_cast<float>(std::round(L_Width[i] * 100000.0) / 100000.0);
}
// 输出转换后的结果
for (size_t i = 0; i < LWidth_float.size(); ++i) {
std::cout << std::fixed << std::setprecision(5) << LWidth_float[i] << std::endl;
}
return 0;
}