我正在将一个字节数组转换为32位浮点。有时数字有点偏离。
示例:
当我在RapidJSON中序列化值时,10.1变成了10.100000381469727。如何使其正常化?
我无法共享该代码。我可以分享的是证明这一点:
std::string BytesToHexString(
unsigned char* data,
size_t len
)
{
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (size_t i = len - 1; i >= 0 && i < len; --i)
ss << std::setw(2) << static_cast<int>(data[i]);
return ss.str();
}
std::string FLOATvalueToHexString(
float value
)
{
union FloatToUChar {
float f;
unsigned char c[sizeof(float)];
};
FloatToUChar floatUnion;
floatUnion.f = value;
return BytesToHexString(
floatUnion.c,
sizeof(float)
);
}
int main()
{
std::string sFloatValue = "10.100000";
float fltValue = atof(sFloatValue.c_str());
std::string strHexFloatValue = FLOATvalueToHexString(fltValue);
std::cout << sFloatValue << " " << fltValue << " " << strHexFloatValue << std::endl;
return 0;
}
打印:10.100000 10.1 4121999a调试器显示fltValue为10.1000004。
如果我转换4121999a,那么这就证实了内部存储器确实关闭了:
https://babbage.cs.qc.cuny.edu/IEEE-754.old/32bit.html
10.100000381469727
如何规范浮点,以便至少可以获得正确的十六进制值?
就像int
类型不能用于非整数一样,double
也只能存储实数的子集。
如果您希望能够准确地存储0.1
,请使用十进制类型。有关起点,请参见C++十进制数据类型。
工作完成了!