0

我有另一个浮点输出问题打印“1.#R”,我已将其缩小到重复值,所以我的问题是如何将值四舍五入到小数点后 2 位,以便我可以打印该值(但不使用“ %.2f")。这是我的代码:

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

void tax_deduction( float *total)
{
    float taxpercent = 1.20;
    float nationalInsurance = 1.175;
    *total = *total - 9000;
    *total = *total / taxpercent;
    *total = *total / nationalInsurance;
    *total = *total + 9000;

}

void hourly_rate(float *rate)
{
    int weeks = 52;
    float hours = 37.5;
    *rate = *rate /(float)weeks;
    *rate = *rate /hours;
}

int main()
{
   float wages;
   float hours = wages;
   printf("Please enter your wage: \n");
   scanf("%f",&wages);
   if(wages > 9000){
    tax_deduction(&wages);
   }
   hourly_rate(&hours);
   printf("wages after tax and NI: %.2f\n", wages);
   printf("wages per month: %.2f\n", wages / 12);
   printf("hourly rate: %.2f\n", hours);
   return 0;
}

它在运行 hourly_rate 函数后的显示方式存在问题,就像我在底部将其编码为printf("hourly rate: %.2f\n", (wages/52)/37/5); 它可以工作,但这并不是我真正想要的编码方式。

谁能想到为什么这不能正常工作?

4

3 回答 3

4

你的问题不是printf. 您的问题是由于使用了未初始化的值,您的代码的算术不正确。

float wages; // wages not initialized
float hours = wages; // hours assigned that uninitialized value
printf("Please enter your wage: \n");
scanf("%f",&wages);
if(wages > 9000){
    tax_deduction(&wages);
}
hourly_rate(&hours); // hours still not initialized

您未能初始化hours

我的猜测是你的意思是hours在读入wages. 因此,将分配移动到hours代码中wages正确定义的位置。

float wages;
printf("Please enter your wage: \n");
scanf("%f",&wages);
if(wages > 9000){
    tax_deduction(&wages);
}
float hours = wages;
hourly_rate(&hours);

%.2f您得到的奇怪输出是使用格式打印浮点 NaN 的结果。我还建议您将if(wages > 9000)测试移到tax_deduction. 正如您目前所拥有的那样,减税代码的那部分已泄漏到调用代码中。

于 2013-04-19T07:31:59.423 回答
1

是的,因为您hours = wages在将值读入工资之前进行了设置。这些是设置为相等的值,而不是引用。

如果您在 scanf 行之后插入小时 = 工资,它将起作用。

此外,就编码风格而言,在像这些简单的情况下,大多数程序员更喜欢使用函数的返回值,而不是发送指向已修改值的指针。这绝不是普遍的,但可能是一个好主意。

于 2013-04-19T07:32:20.560 回答
0

要添加有关未初始化变量的其他答案:

printf()正在尝试打印1.#QNAN(可能是因为未初始化变量的值恰好是“安静的 NAN”)。但是精度没有足够的空间,所以1.#QNAN字符串被“四舍五入”到1.#R. 有关此现象的详细信息,请参阅以下文章:

于 2013-04-19T08:05:54.350 回答