You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中标准差计算结果小数位为0的问题排查求助

问题分析与解决

核心问题

你的标准差小数部分被截断为0,本质是两个计算函数的返回类型错误:get_average和get_standard_deviation都声明返回int(整数类型),但实际计算的是带小数的浮点数。当函数返回时,C语言会自动将浮点数强制转换为整数,直接丢弃小数部分,最终导致平均值和标准差的小数部分全部丢失。

具体错误点

  1. get_average函数:内部计算出的result是double类型,但函数返回int,返回时会截断小数。比如平均值是3.333,返回后会变成3,这直接导致后续标准差的计算基准出错。
  2. get_standard_deviation函数:就算内部算出了带小数的标准差(比如1.1547),但返回int会把结果截断为整数;如果计算结果小于1,就会直接变成0。

修正后的代码

#include <stdio.h>
#include <math.h>
#define SIZE 3

// 把返回类型改成double
double get_average(int a[], int size);
double get_standard_deviation(int a[], int size, double average); 

int main(void) {
    int list[SIZE]; 
    int i; 
    double average, standard_deviation;

    for (i = 0; i < SIZE; i++) {
        printf("input data:");
        scanf("%d", &list[i]); 
    }
    average = get_average(list, SIZE); 
    standard_deviation = get_standard_deviation(list, SIZE, average);

    printf("average is %lf.\n", average);  
    printf("standard deviation is %lf.\n", standard_deviation); 
     
    return 0;
}
// 返回类型改为double
double get_average(int a[], int size) { 
    int i;
    int sum = 0;
    double result;
    for (i = 0; i < size; i++) {
        sum += a[i];
    }
    result = (double)sum / size;
    return result;
}
// 返回类型改为double
double get_standard_deviation(int a[], int size, double average) {    
    double result;
    int i;
    double sum = 0;
    for (i = 0; i < size; i++) {
        sum += (a[i] - average) * (a[i] - average); 
    }
    result = sqrt(sum / size); // sum已是double类型,无需额外强制转换
    return result; 
}

额外优化说明

get_standard_deviation里的(double)sqrt(((double)sum / size))可以简化为sqrt(sum / size)——因为sum本身是double类型,除以size后结果仍为double,sqrt函数会直接处理double参数,多余的强制转换完全没必要。

内容的提问来源于stack exchange,提问作者Arin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:51:24