我有另一个浮点输出问题打印“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(“每小时费率:%。2f \ n”,(工资/ 52)/ 37/5); 它有效,但这不是我想要编码的方式。
有人能想到为什么这种方法不正常吗?
答案 0 :(得分: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
测试。正如你现在所知,税收减免代码的那部分已泄露到调用代码中。
答案 1 :(得分:1)
是的,因为您在将值读入工资之前设置了hours = wages
。这些值设置相等,而不是引用。
如果在scanf行之后插入hours = salary,它将起作用。
此外,作为编码风格的问题,在这些简单的情况下,大多数程序员更喜欢使用函数的返回值,而不是发送指向已修改值的指针。这绝不是普遍的,但可能是一个好主意。
答案 2 :(得分:0)
添加有关未初始化变量的其他答案:
您的printf()
正在尝试打印1.#QNAN
(可能是因为未初始化变量的值恰好是“安静的NAN”)。但是精度没有足够的空间,因此1.#QNAN
字符串被“向上舍入”到1.#R
。有关此现象的详细信息,请参阅以下文章: