【问题标题】:Unwanted Rounding in Division除法中不需要的舍入
【发布时间】:2020-02-20 06:09:04
【问题描述】:

我有一个 20 位长的数组;我想找到数组中所有负数的算术平均值,然后从这个数组的每个元素中减去这个数字。 问题是当我尝试将负数的值的总和除以负数的数量(以找到平均值)时,它会自动向下舍入到最接近的整数

代码如下:

int main()
{
    double a1 = 0.0;
    double b2 = 0.0; // arth mean
    int arr[20] = {12, -30, 23, -43, 51, 26, 0, 88, 19, -10, 11, 2, 23, -14, 15, 6, -7, 1, -19, 120};
    for(int i = 0; i < 20; i++) {
        if(arr[i] < 0) {
            a1 += arr[i]; // sum of negative numbers
        }
    }
    b2 = a1 / 6;
    cout << b2;
     for(int i = 0; i < 20; i++) {
        arr[i] = arr[i] - b2;
    }
    for(int i = 0; i < 20; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

【问题讨论】:

  • 问问自己:arr 中的元素是什么类型的?支持小数点的剂量吗?
  • b2 未四舍五入(除了自然浮点数不准确)。只有在 arr 中计算新值时才会取整
  • @opage_potato 你是说cout &lt;&lt; b220 写入控制台吗?似乎它应该给你类似-20.5
  • 数组中的值没有四舍五入,它们被截断
  • 这并没有解决问题,但double b2 = 0.0; // arith mean 应该是double arith_mean = 0.0;。使用有意义的名称。

标签: c++ math


【解决方案1】:

您正在更改arr,它是int 类型的数组,因此每个浮点数据类型都会自动更改为忽略小数点,剩余数字为int,即int 5 = 5.9; 将等于@987654325 @ 这是你最后一行的答案。因此将您的数组arr 转换为浮点或双精度数据类型。

 float arr[20] = {12, -30, 23, -43, 51, 26, 0, 88, 19, -10, 11, 2, 23, -14, 15, 6, -7, 1, -19, 120};
    for(int i = 0; i < 20; i++) {
        if(arr[i] < 0) {
            a1 += arr[i]; // sum of negative numbers
        }
    }

【讨论】:

  • 这是错误的。在 C++ 中,将 double 除以 int 得到 double。不信就试试看。
  • 你的权利,我看错了。删除我的帖子。我以为 a1 是 int。
  • 如果我将 double 除以 int,我们会得到 double,但如果我们将该 double 存储在整数数据类型中,它会自动删除小数部分(这就是在这个问题中发生的情况)。
【解决方案2】:

我只是在本地运行代码,它确实吐出了 -20.5。完整的输出是这样的:

-20.532 -9 43 -22 71 46 20 108 39 10 31 22 43 6 35 26 13 21 1 140

也许您的困惑是您没有在第一个数字后添加空格?试试

cout << b2 << " ";

相反,也许它会更清楚。另请注意,这样做时:

arr[i] = arr[i] - b2;

RHS 是一个浮点数,当存储在 arr[i] 时会被截断。为避免这种情况,请将 arr 设为浮点数组而不是整数。

【讨论】:

  • @UpAndAdam 但是 a1 是双精度的。如果您不相信我,请运行代码。
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多