程序转换打印浮点值作为分数不工作..?

时间:2017-05-06 06:30:28

标签: c math floating-point decimal

所以我正在尝试编写一个程序,该程序采用浮点值并用分数表示。我面临着一个奇怪的问题。这是我的计划:

#include<stdio.h>
#include<math.h>
int gcd(int,int);

void main()
{
    int n,n1,n2,g;
    float a,a1;
    printf("Enter number of digits after decimal point: ");
    scanf("%d",&n);
    printf("Enter number: ");
    scanf("%f",&a);
    n2=pow(10,n);
    a1=a*n2;
    n1=(int)a1;
    g=gcd(n1,n2);
    n1/=g;n2/=g;
    printf("The number is %d/%d",n1,n2);
}


int gcd(int a,int b)
{
    int x,flag=0;
    int n1=((a>b)?a:b);
    int n2=((a<b)?a:b);
    for(x=n1;x>=1;x--)
    {
        if(n1%x==0 && n2%x==0)
        {
            flag=1;break;
        }
    }
    if(flag==1)
        return x;
    else
        return 1;

}

现在这个程序给出了只有1个小数点的数字的正确答案。例如:

Enter number of digits after decimal point: 1
Enter number: 2.5
The number is 5/2

但是对于小数点后两位或更多位数的数字,它会给出错误的答案。例如:

Enter number of digits after decimal point: 2
Enter number: 2.50
The number is 247/99

我知道浮点数不准确,但我没想到这个变化很大。有没有办法解决这个问题并使这个程序工作?

2 个答案:

答案 0 :(得分:5)

适合我。我相信原因是您使用include Irvine32.inc .data .code main proc mov ebx, -27 mov eax, 33 mov ecx, 50 L1: pushad ; save all 32bit registers call BetterRandomRange call writeint call crlf popad ; restore all 32bit registers loop L1 main endp BetterRandomRange proc neg ebx add eax, ebx call randomrange sub eax, ebx ret BetterRandomRange endp end main pow(10, n)inexact on your platform。请改用简单的for循环:

pow

答案 1 :(得分:0)

pow(10, n)这样的函数可能会生成接近整数值的结果而不是精确的整数值。如果您想继续使用(int),请使用其中一个轮次函数,而不是使用pow()进行截断。

考虑long int lround(double x)long int lroundf(float x)在一次调用中舍入并转换为整数类型。

  

lroundllround函数将它们的参数四舍五入到最接近的整数值,无论当前的舍入方向如何,都将中间情况四舍五入。 C11§7.12.9.72

n2 = lround(pow(10,n));
a1 = a*n2;
n1 = lroundf(a1);