c++ - 读取浮点值时出错

标签 c++ c floating-point

我正在尝试编写一个非常简单的程序,它首先读取一个整数N,然后读取N个 float 数据,然后将它们放回屏幕上,小数点后有2位数字。这很简单,对吧?但出了问题!这是源代码:

#include<cstdio>

int main()
{
  float d;
  int n;
  scanf("%d",&n);
  while(n>0)
  {
    n--;
    scanf("%f",&d);
    printf("%.2f\n",d);
  }
  return 0;
}

当我输入较小的值(例如 3.1 或 1.0)时,效果非常好。但是当我给出大值(例如 -765057.71 或 978715.10)时,它会打印不同的值。从 -765057.71 开始,它打印 -765057.69,对于下一个,它打印 978715.13。为什么会发生这种情况?我该如何解决这个问题?

最佳答案

原始浮点类型没有无限的精度。正如您所看到的,有些值无法准确表示。您可以通过使用 double 而不是 float 来稍微缓解此问题,但对于足够大的值,您仍然会看到相同的问题。

其他更强大的解决方案包括使用预构建的任意精度库、滚动您自己的此类库(如果您有时间消磨时间)、使用两个整数表示浮点值,一个表示小数点之前的部分一个用于后面的部分,或者(如果您只想将数字回显到给定的小数位置)改为使用字符串。

您可能会发现这篇文章很有趣:http://en.wikipedia.org/wiki/IEEE754

关于c++ - 读取浮点值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577561/

相关文章:

java - Java中float "1"和float "1f"有什么区别?

c++ - 具有超过 4 个参数的 cppcms url dispather

java - 如何写入和读取从java传递给jni的bytebuffer

c++ - C++ 中是否有一个简单且开源的光线转换库?

带有字符串的 C 结构数组 - 操作/访问

c - 如何从 NSArray 生成 C vector 或数组?

android - OpenCV:检测颜色并在颜色上画线

c - 生成随机投票号码

c - 是什么导致数组中的 float 舍入?

C# 浮点和小数输入以及数学