关于C语言计算过程中保留有限位小数的问题

  1. 我在C语言的计算过程中定义了一个结构体,结构体里面有数组有变量,都是double型的
typedef struct PealValley {
    double Peakval[Len_Data];
    double Valleyval[Len_Data];
    double PeakValle[Len_Data];
}PP;
  1. 计算过程中有写数难免会出现小数,例如2.6779999999999999这样的数据,如果只要保留后两位“显示”的话,用printf(“%.2f”,a)即可完成,但是现在在计算过程中为了避免计算量,提高计算速度,我想把后几位的小数删除,直接用2.68来代替2.6779999999999999,这样怎么实现呢?

img

  1. 还有问题就是我用VS调试代码的时候发现2.6779999999999999这种数据给结构体指针变量赋值的时候有时候会不对,比如我定义了结构体指针PP *PeakVall;PeakVall->Peakval是定义的结构体成员数组,长度为100;我把2.6779999999999999这个值幅值给PeakVall->Peakval[i]【加入这时候i=0】,但是得到的PeakVall->Peakval[0]的数据不是2.6779999999999999而是随机的一个很小的数字,这个是什么问题?
    for (n_data = 1; n_data < len-1; n_data++)
    {
        if ((data[n_data] > data[n_data - 1]) && (data[n_data] > data[n_data + 1])) //筛选峰值
        {
            (PeakVall->Peakval)[i] = data[n_data];
            (PeakVall->PeakValle)[k] = data[n_data];
            i++;
            k++;
        }
        else if ((data[n_data] < data[n_data - 1]) && (data[n_data] < data[n_data + 1])) //筛选谷值
        {
            PeakVall->Valleyval[j] = data[n_data];
            PeakVall->PeakValle[k] = data[n_data];
            j++;
            k++;
        }
    }

这段代码很简单就是一个求峰值和谷值的程序,但是计算出来的峰值和谷值有问题。

img
求出来的数据峰值是这样的:

img
我看了数据,正常是前面7个正确 ,但是后面的一大堆不知道咋回事

4.考虑到3中所说的问题是因为double的数据小数位数太多导致的, 我想把2.6779999999999999这个数据在计算过程中保留两位小数【注意不是显示两位小数】,便于后续计算,应该怎么操作?

保留两位小数,就把原始数据+0.05,然后乘以100,再取整,再除掉100即可

n_data + 1 会越界

首先,第一个问题,浮点运算是采用科学技术法来表示的,计算机正常采用的是IEEE754浮点数标准,举个例子一个八位(阶位)表示:2.999它对应的科学计数法写法 0.29990000 × 10的一次方(它是会补0的),cpu在计算浮点数的时候零也是会被进行多次的(或)运算,个人感觉这个把浮点数后面该为零对计算速度影响应该可以忽略不计(再加上你要遇五进一,这种额外的运算量,不划算),除非改成整数。第二个问题,同类型的赋值是不会出现丢失精度问题的(个人猜测可能你那里写错了)。第三个问题,前面解释了,优化方案,如果你只需要两位小数那可以直接乘上100全部改为整数运算会快很多,最后结束的时候在把它转换过来(方法很多,具体看要求数据量,空间,时间,最快的不一定是最好的)