C中浮子的精确精度

时间:2018-06-20 19:25:41

标签: c logic

为图像中的问题提供程序。

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

int main()
{
    int N,R,A[100],B[100],i,flag=0;
    double sol;
    scanf("%d%d",&N,&R);

    for(i=0;i<N;i++)
    {
        scanf("%d",&A[i]);
    }
    for(i=0;i<N;i++)
    {
        scanf("%d",&B[i]);
    }
    for(i=0;i<N;i++)
    {
        if(R>=A[i]&&R<=A[i+1])
        {
            sol=(double)R-(R*B[i])/100;
            flag++;
        }
    }
    if(flag==0)
    {
        sol=(double)R;
    }
    printf("%.2f",sol);
}

该程序通过了三个测试用例。但是失败了五。并显示预期输出3176.5,而实际输出为3177.0。如何清除所有案件。

enter image description here

1 个答案:

答案 0 :(得分:3)

问题在这里:

sol=(double)R-(R*B[i])/100;

子表达式(R*B[i])/100中的每个变量和常量的类型均为int,因此结果也为类型int。除法运算是整数除法,它会将结果截断。您在R上进行的强制类型转换还不够,因为减法运算符的右侧操作数已经被评估为int

将常数100更改为100.0。这将为其赋予类型double,这将导致除法为浮点除法。

sol=(double)R-(R*B[i])/100.0;

此外,以下比较将在最后一次迭代中读取到数组A的末尾:

if(R>=A[i]&&R<=A[i+1])

您需要考虑最后一项的情况:

if((R>=A[i]) && ((i==N-1) || (R<=A[i+1])) )