| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1849 人关注过本帖
标题:求助。琢磨了好久
只看楼主 加入收藏
jtsqrj
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-13
结帖率:25%
收藏
已结贴  问题点数:20 回复次数:10 
求助。琢磨了好久
# include<stdio.h>
int main(void)
{
    int  deduction;
    double  tax,salary,rate;
    printf("Enter salary:");
    scanf("%lf",&salary);
    if(salary<=3500)
    {
    deduction=0,rate=0.00;
    tax=rate*(salary-3500)-deduction;
    }
    else
    if(salary<=5000)
    deduction=0,rate=0.03;
    else
    if(salary<=8000)
    deduction=105,rate=0.10;
    else
    if(salary<=12500)
    deduction=555,rate=0.20;
    else
    if(salary<=38500)
    deduction=1005,rate=0.25;
    else
    if(salary<=58500)
    deduction=2775,rate=0.30;
    else
    if(salary>58500)
    deduction=13505,rate=0.45;
    tax=rate*(salary-3500)-deduction;
    printf("tax=%.2f",tax);
    return 0;
}
输入月薪salary,输出应交的个人所得税tax(保留2位小数)。按照2011年开始实行的新的个人所得税法,计算公式为:tax = rate*(salary-3500)-deduction。
当salary≤3500时,rate=0、deduction=0
当3500<salary≤5000时,rate=3%、deduction=0
当5000<salary≤8000时,rate=10%、deduction=105
当8000<salary≤12500时,rate=20%、deduction=555
当12500<salary≤38500时,rate=25%、deduction=1005
当38500<salary≤58500时,rate=30%、deduction=2775
当83500<salary时,rate=45%、deduction=13505
这是题目,其他都解决了,但是输入3500以下的,比如200,输出结果为-0.00.应该是0.00,请问这是怎么回事?
搜索更多相关主题的帖子: include double Enter 
2016-10-16 18:25
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:7 
if(salary<=3500)
     {
     deduction=0,rate=0.00;
     tax=rate*(salary-3500)-deduction;  //tax=0.0;
     }
tax=0*(salary-3500)-0=-0 注意deduction前面的减号

早知做人那么辛苦!  当初不应该下凡
2016-10-16 18:49
jtsqrj
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-10-13
收藏
得分:0 
回复 2楼 炎天
那么这里怎么处理,公式是这样子的。。。
2016-10-16 18:55
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 3楼 jtsqrj
我又看了下 我刚刚的解答应该是错的

早知做人那么辛苦!  当初不应该下凡
2016-10-16 19:21
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
    if(salary<=3500)
     {
     deduction=0,rate=0.00;
     tax=rate*(salary-3500)-deduction; //这一行去掉
     }
倒数第三行
tax=rate*(salary-3500)-deduction+0.00001;//后面加个0.00001并不影响精度,反而能得到正的0.00。
2016-10-16 19:26
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 5楼 ehszt
为什么能这样做,
出错的原因的是什么?

早知做人那么辛苦!  当初不应该下凡
2016-10-16 19:32
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 6楼 炎天
double不精确,得到的结果其实是个近似的负值。

[此贴子已经被作者于2016-10-16 19:34编辑过]

2016-10-16 19:33
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 7楼 ehszt
知道了,谢谢

早知做人那么辛苦!  当初不应该下凡
2016-10-16 19:49
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:7 
虽然知道有正负0,0x00000000表示+0;0x80000000表示-0。(这两个数值是相等的)
还有一种就是printf的四舍六入五留双也有可能导致-0的出现,
但是很明显tax=rate*(salary-3500)-deduction;这句并不能产生一个近似值接近0的负数,从而让printf四舍六入五留双,
那么就只剩下一个解释tax的值是0x80000000.
如果说有一个负数无限接近于0还能说的过去,可是没有,只能想到编译器的原因。
除了编译器的原因,我实在想不出其它的原因导致这段代码输出-0.00。
能不能说下你用的是什么编译器,在什么环境下运行的。让别人试试。至少我没试出这个-0.00。

[此贴子已经被作者于2016-10-16 22:12编辑过]

2016-10-16 20:43
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 9楼 linlulu001
也许如你所说是编译器造成的,但不管怎样加个0.000001确实可以解决问题。
2016-10-17 08:24
快速回复:求助。琢磨了好久
数据加载中...
 
   



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

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