c++ - 如何避免 C++ 中的 float 舍入问题?

标签 c++ floating-point floating-point-conversion

使用下面的代码,我得到结果“4.31 43099”。

  double f = atof("4.31");
  long ff = f * 10000L;
  std::cout << f << ' ' << ff << '\n';

如果我将“double f”更改为“float f”。我得到预期结果“4.31 43100”。我不确定将“double”更改为“float”是否是一个好的解决方案。有什么好的解决方案可以确保我得到“43100”吗?

最佳答案

您将无法消除浮点运算中的错误(尽管通过适当的分析您可以计算出错误)。对于随意使用,为了获得更直观的结果,您可以做的一件事是用正常的舍入替换内置的 float 到整数的转换(它会截断):

double f = atof("4.31");
long ff = std::round(f * 10000L);
std::cout << f << ' ' << ff << '\n';

这应该输出您所期望的:4.31 43100


此外,使用 10000L 也没有意义,因为无论您使用哪种整数类型,它仍然会转换为 f 的浮点类型以进行乘法运算。只需使用 std::round(f * 10000.0);

关于c++ - 如何避免 C++ 中的 float 舍入问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330633/

相关文章:

java - RMS 的快速计算在 Java 中给出了 NaNs - 浮点错误?

lua - 使用 LUA 解码 UDP 消息

go - 如何以正确的方式将 float64 数字更改为 uint64?

你能在 C 中将一个值四舍五入到小数点后两位吗?

java - 如何使用Java将字符串逐字符转换为浮点型?

c++ - 如何测量队列中每秒弹出/推送的速率?

c++ - 如果前一个字符相同则跳过数组中的一个字符

c++ - 你如何将世界坐标系的自然单位转换为opengl单位?

c++ - 违反 noexcept 保证的编译器警告或静态分析?

python - 如何在字符串(单元格)数组中查找字符,Python