首页 > 解决方案 > 将浮点数转换为精确且无公差的字符串

问题描述

如何将浮点数转换为具有指定精度且无公差的字符串?例如,精度为 6 得到以下结果。

40.432 -> 40.432000.

在一个字符串中,我能得到的唯一值是 40.431999。

标签: c++floating-pointprecision

解决方案


如何将浮点数转换为具有指定精度的字符串

您可以使用字符串流:

std::ostringstream strs;
strs << std::fixed << std::setprecision(6)  << the_value;
std::string str = strs.str();

在一个字符串中,我能得到的唯一值是 40.431999。

您的问题可能是您的系统使用的浮点格式中不存在 40.432 的精确表示。由于您永远无法拥有浮点值 40.432,因此您永远无法将此类值转换为字符串。

碰巧最接近 40.432 的可表示值更接近 40.431999,而不是 40.432。

你需要:

  1. 要么接受 40.432 ~~ 40.431999
  2. 或者使用足够精确的浮点格式来表示 40.432,它比 40.431999 更接近 40.432,并且对于您具有特定期望值的所有其他数字也足够精确。IEEE 754 双精度浮点恰好具有比 40.431999 更接近 40.432 的可表示值。
  3. 或者停止使用浮点数。如果您使用定点或任意精度数据类型,您将不会遇到这样的问题。

推荐阅读