Flash*强 2021-08-17 09:47 采纳率: 50%
浏览 161
已结题

关于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这个数据在计算过程中保留两位小数【注意不是显示两位小数】,便于后续计算,应该怎么操作?

  • 写回答

3条回答 默认 最新

  • 向未知探索 2021-08-17 13:11
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月25日
  • 已采纳回答 8月17日
  • 创建了问题 8月17日

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试