c - 在 float 变量中排序后数组值发生变化

标签 c arrays sorting floating-point

我运行此代码并在数组“s”中输入浮点值,但在排序后,数组元素的新值与输入值略有不同。为什么会这样? 这是我运行的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <conio.h>


void main()
{
    int N,sorted,i;

    printf("How many students?\n");
    scanf("%d",&N);
    float s[N],temp;

    for(i=0;i<N;i++)
    {
        printf("Marks of student %d?\n",i+1);
        scanf("%f",&s[i]);
    }
    //bubble sorting ---
    while(1)
    {
        sorted=0;
        for(i=0;i<N-1;i++)
        {
            if(s[i]<s[i+1])
            {
                temp=s[i];
                s[i]=s[i+1];
                s[i+1]=temp;
                sorted=1;
            }
        }
        if(sorted==0)
            break;
    }
    printf("\nSorted Marks - \n\n");
    for(i=0;i<N;i++)
    {
        printf("%f\n",s[i]);
    }
}

输入:

N=5
Marks = 34.53,54,34,56.76,87.567

输出:

Sorted Marks -

87.567001
56.759998
54.000000
34.529999
34.000000

最佳答案

简短的回答是并非所有 float 都可以精确存储,因此系统会选择“最接近”的可能数字,这可能导致例如34.53 变为 34.529999。 – 一些程序员老兄

您可以通过两种方式“解决”问题。 1) 将中的float改为double,将"%f"改为"%lf"扫描。 2) 将printf中的"%f"改为"%.4f"。 – 用户 3386109

关于c - 在 float 变量中排序后数组值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34285975/

相关文章:

我可以从寄存器中获取整数的 2s 补码表示吗?

python - 如何在Python列表中添加和扩展新行?

c++ - 具有未定义大小的数组作为类成员

javascript - 如何修复计数器不显示正确值以及使用新字符串重置的问题

Bash 像 Windows 一样排序 'natural sort order'

c# - 使用一个 TKey 数组对多个 TValue 数组进行排序

c++ - 值初始化 vs Calloc vs 手动初始化速度

c - Escaping "white space"在C中转义

c - 为什么标准输出缓冲?

java - 如何通过主类调用另一个类的方法?