Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何设置有理数的十进制展开的精度级别_C - Fatal编程技术网

C 如何设置有理数的十进制展开的精度级别

C 如何设置有理数的十进制展开的精度级别,c,C,我试图打印出C中有理数的十进制展开式。我遇到的问题是,当我用分子除以分母时,我失去了精度。C在我不想重复的部分时将其舍入 例如,1562/4995=0.3127127。。。但在我的程序中,我得到1562/4995=0.312713。正如你所看到的,我需要的电话号码的一部分已经丢失了 有没有办法指定C来保持更高级别的十进制精度 我试图将结果声明为双精度、长精度双精度和浮点型。我还尝试将展开式拆分为两个整数,用“.”分隔 然而,这两种方法都没有成功 int main() { int nume

我试图打印出C中有理数的十进制展开式。我遇到的问题是,当我用分子除以分母时,我失去了精度。C在我不想重复的部分时将其舍入

例如,1562/4995=0.3127127。。。但在我的程序中,我得到1562/4995=0.312713。正如你所看到的,我需要的电话号码的一部分已经丢失了

有没有办法指定C来保持更高级别的十进制精度

我试图将结果声明为双精度、长精度双精度和浮点型。我还尝试将展开式拆分为两个整数,用“.”分隔

然而,这两种方法都没有成功

int main() {
    int numerator, denominator;
    numerator = 1562;
    denominator = 4995;

    double result; 
    result = (double) numerator / (double) denominator;
    printf("%f\n", result);

    return 0;
}

我期望输出为1562/4995=0.3127127。。。但实际输出为1562/4995=0.312713

默认情况下,
%f
格式说明符to
printf
在小数点后显示6位数字。如果要显示更多数字,请使用精度说明符:

 printf("%.10f\n", result);

另外,
double
类型只能准确地存储大约16位小数精度。

您需要更改输出格式,如下所示:

printf("%.10lf\n", result);
注意两件事:

  • 后面的值指定所需的小数精度(此处为10位小数)
  • 请注意,我在
    f
    之前添加了
    l
    ,以显式地声明参数是
    double
    而不是(单精度)
    float
  • 编辑:请注意,对于
    printf
    函数,严格来说没有必要包含
    l
    修饰符。但是,当您开始使用“对应的”
    scanf
    功能进行输入时,如果没有该功能,将产生警告和(可能)未定义的行为:

    scanf("%f", &result); // Not correct
    scanf("%lf", &result); // Correct
    

    如果你只想打印,你可以用小学时教的长除法来完成:

    #include <stdio.h>
    
    
    /*  Print the decimal representation of N/D with up to
        P digits after the decimal point.
    */
    #define P   60
    static void PrintDecimal(unsigned N, unsigned D)
    {
        //  Print the integer portion.
        printf("%u.", N/D);
    
        //  Take the remainder.
        N %= D;
    
        for (int i = 0; i < P && N; ++i)
        {
            //  Move to next digit position and print next digit.
            N *= 10;
            printf("%u", N/D);
    
            //  Take the remainder.
            N %= D;
        }
    }
    
    
    int main(void)
    {
        PrintDecimal(1562, 4995);
        putchar('\n');
    }
    
    #包括
    /*打印N/D的十进制表示形式,最多为
    小数点后的P位。
    */
    #定义P60
    静态void PrintDecimal(无符号N,无符号D)
    {
    //打印整数部分。
    printf(“%u.”,不适用);
    //拿剩下的来说。
    N%=D;
    对于(int i=0;i
    并非完全相同,但请参见。它可能会给你一些想法。考虑一下将
    浮点值指定为
    0.3127127…
    很可能不准确。
    float
    通常只有7位小数精度。在这种情况下,
    l
    标志无效。传递给变量函数的
    float
    隐式提升为
    double
    。@dbush不是
    result
    实际上是
    double
    ,根据问题?@dbush不必要,是;无效,不!但是习惯于指定显式格式很好。谢谢你给我看这个,我从来没有想过这样做,它真的很聪明