| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2263 人关注过本帖
标题:分数化小数时,最后一个小数输出问题
只看楼主 加入收藏
喂丶等等
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-12-22
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:14 
分数化小数时,最后一个小数输出问题
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。例如a=1,b=6,c=4时应输出0.1667
程序代码:
#include<stdio.h>
int main(void)
{
    int a,b,c,i,yushu;
    scanf("%d %d %d",&a,&b,&c);
     
    printf("%d.",a/b);
    yushu=a%b;
    
    for(i=1;i<=c;i++)
    {
        yushu=yushu*10;
        printf("%d",yushu/b);
        yushu=yushu%b;
    }
    return 0; 
} 
但是输出的却是0.1666,该怎么修改?
搜索更多相关主题的帖子: 小数点 正整数 
2015-12-22 21:25
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
最后一位单独处理,多算一位判断舍入情况

重剑无锋,大巧不工
2015-12-23 00:28
ntprc0x
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:23
专家分:130
注 册:2015-11-14
收藏
得分:0 
。。。。


[此贴子已经被作者于2015-12-23 01:23编辑过]

2015-12-23 01:19
ntprc0x
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:23
专家分:130
注 册:2015-11-14
收藏
得分:0 
回复 2楼 beyondyf
也不能单独处理最后一位
还有进位要处理  如:
精确到2位:
8.995  9.999
9.00   10.00
2015-12-23 01:40
喂丶等等
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-12-22
收藏
得分:0 
回复 4楼 ntprc0x
是啊,就纠结这个,不知道有没有哪个函数可以让输出保留c位小数
2015-12-24 18:33
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:3 
#include <stdio.h>

int foo(int n)
{
    int i , r = 1;
    for(i = 0; i < n ; i++) r = r * 10;

    return r;
}

int main()
{
    int a = 57, b = 7, c = 5, d, e, i;

    e = foo(c+1);
    d = a * e / b + 5;

    printf("%d.", d / e);

    d = d % e;
    for( i = c; i > 0; i--)
    {
        e = foo(i);
        printf("%d", d / e);
        d = d % e;
    }

    return 0;
}

非要玩整数话,大致思路是数a左移c+1位,然后除b,得到的数最后一位 +5, 就会自动四舍五入。
然后按位输出c位得到结果。整数有溢出的可能。
2015-12-24 22:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
printf()帶寛度的格式控制符就含有四捨五入功能。

授人以渔,不授人以鱼。
2015-12-24 22:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
你首先試下面的代碼:
程序代码:
int a = 1, b = 6, c = 4;
printf("%.4f", (double)a / b);
putchar('\n');


這裏的關鍵點是printf()中的格式控制串.4f,意思是輸出四捨五入到小數點後第4位。現在的問題,是如何令這個串中的4可變。解決方法是把可變的c輸出到格式控制串中,這要用到向字符串輸出的函數sprintf()。代碼如下:
程序代码:
int a = 1, b = 6, c = 4;
char strFormat[64];
sprintf(strFormat, "%%.%df", c);        // 這裏把strFormat串構造成"%.4f",再在後面的printf()使用它
printf(strFormat, (double)a / b);
putchar('\n');


[此贴子已经被作者于2015-12-24 23:07编辑过]


授人以渔,不授人以鱼。
2015-12-24 22:54
ntprc0x
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:23
专家分:130
注 册:2015-11-14
收藏
得分:2 
按楼主的问题C可能会比较大 如 20 50 100
printf()就达不到要求了 其实应该是它的输出数据的类型吧 double ,long double ,long long ....... double?
按楼主的思路 先存储 整数 和 c+1位小数部分 在四舍五入并进位处理
程序代码:
#include<stdio.h>

#define MAX 1000

int main(void)
{
    int a,b,c,i,yushu;
    int m;    // 整数部分

    int jw; // 进位

    int arr[MAX];    // 小数部分

    scanf("%d %d %d",&a,&b,&c);
    

    //printf("%d.",a/b);
    m = a/b;
   

    yushu=a%b;
      

       for(i=0;i<=c;i++)
    //for(i=1;i<=c;i++)
    {
        yushu=yushu*10;
        //printf("%d",yushu/b);
        arr[i] = yushu/b;
        yushu=yushu%b;
    }
   

    jw = arr[c]/5;  // 第C+1位小数 四舍五入
   

    for(i=c-1;i>=0;i--)        //进位处理

    {
        arr[i] += jw;
        if( jw=arr[i]/10 )
            arr[i] %= 10;
            // arr[i] = 0; // 一样?
        else
            break;

    }
   

    printf("%d.", m+jw);
    for(i=0;i<c;i++)
        printf("%d",arr[i]);
    printf("\n");
   

    return 0;
}

2015-12-25 17:16
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
看起来很麻烦。用宏配合格式输出符行吗?
2015-12-25 18:28
快速回复:分数化小数时,最后一个小数输出问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019898 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved