簡體   English   中英

浮點數是printf錯誤的值

[英]Float is printf wrong value

我還有另一個浮點輸出問題,打印“ 1.#R”,我將其范圍縮小到重復出現的值,所以我的問題是如何將值四舍五入到小數點后兩位,所以我可以打印該值(但不能使用“ %.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 ); 它可以工作,但這並不是我真正想要的編碼方式。

有人能想到為什么它不能正常工作嗎?

您的問題不是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

我的猜測是,您的意思是看完wages后要初始化hours 因此,將分配移動到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 就像您目前所擁有的那樣,那部分減稅代碼已泄漏到調用代碼中。

是的,因為在將值讀入工資之前,您設置hours = wages工資。 這些是設置為相等的值,而不是引用。

如果在scanf行之后插入小時數=工資,它將起作用。

此外,就編碼風格而言,在像這樣的簡單情況下,大多數程序員更喜歡使用函數的返回值,而不是發送指向已修改值的指針。 這絕不是普遍的,但可能是一個好主意。

要添加有關未初始化變量的其他答案:

您的printf()正在嘗試打印1.#QNAN (大概是因為未初始化變量的值恰好是“安靜的NAN”)。 但是精度沒有足夠的空間,因此1.#QNAN字符串被“舍入”為1.#R 有關此現象的詳細信息,請參閱以下文章:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM