如何处理浮点不精确



我正在将一个字节数组转换为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++十进制数据类型。

工作完成了!

最新更新