C 如何确定数字的小数位数?

C 如何确定数字的小数位数?,c,decimal,C,Decimal,我正在用C写一个程序 有没有办法确定小数位数 在浮点数中(即0.123=3,0.123456=6等) 除了将数字转换为字符串和使用字符串 用于提取小数点后字符的函数 我有一个名为computeFare()的函数 结果:总票价为34.56美元 我这样做了,它返回34.56。。。 我想要34.57美元 谢谢, 劳伦斯。不太可能,小数位数是数字内部表示形式的函数。当您显示数字时,您看到的是,以字符串形式打印的数字 因此,如果您对显示的值感兴趣,您可以使用第一位的格式化指令(例如,%5.2f)来控制小数

我正在用C写一个程序

有没有办法确定小数位数 在浮点数中(即
0.123=3
0.123456=6
等)

除了将数字转换为字符串和使用字符串 用于提取小数点后字符的函数

我有一个名为computeFare()的函数

结果:总票价为34.56美元

我这样做了,它返回34.56。。。 我想要34.57美元

谢谢,
劳伦斯。

不太可能,小数位数是数字内部表示形式的函数。当您显示数字时,您看到的是,以字符串形式打印的数字

因此,如果您对显示的值感兴趣,您可以使用第一位的格式化指令(例如,
%5.2f
)来控制小数位数,或者使用字符串函数方法,就像您在文章中提到的那样,在将数字作为字符串后使用字符串函数方法

另外,作为旁白,你会计算尾随的零吗

也许陈述一下你想这样做的目标会有帮助?可能还有其他方法来完成你想要做的事情

更新

根据您的更新,问题实际上不是计算小数位数,而是您遇到了表示问题/舍入错误(并非罕见)。问题是,一些分数值不能在基数2中精确表示。这里有一个详尽的解释:

看看这个问题:

您可以尝试使用此方法对值进行四舍五入:

float rounded_val = floorf(value * 100.0 + 0.5) / 100.0; 

Wikipeadia上有一整篇文章。

不太可能,小数位数是数字内部表示形式的函数。当您显示数字时,您看到的是,以字符串形式打印的数字

因此,如果您对显示的值感兴趣,您可以使用第一位的格式化指令(例如,
%5.2f
)来控制小数位数,或者使用字符串函数方法,就像您在文章中提到的那样,在将数字作为字符串后使用字符串函数方法

另外,作为旁白,你会计算尾随的零吗

也许陈述一下你想这样做的目标会有帮助?可能还有其他方法来完成你想要做的事情

更新

根据您的更新,问题实际上不是计算小数位数,而是您遇到了表示问题/舍入错误(并非罕见)。问题是,一些分数值不能在基数2中精确表示。这里有一个详尽的解释:

看看这个问题:

您可以尝试使用此方法对值进行四舍五入:

float rounded_val = floorf(value * 100.0 + 0.5) / 100.0; 

Wikipeadia上有一整篇文章。

使用
printf
可以指定小数位数

  • %.0f
    不等于小数点
  • %.4f
    等于显示四位小数的浮点

使用
printf
可以指定小数位数

  • %.0f
    不等于小数点
  • %.4f
    等于显示四位小数的浮点

数字(通常)将存储在基数2中,因此小数不太可能精确对应于简洁的十进制字符串。为了得到简洁的小数,您可能必须首先进行四舍五入。

数字(通常)将存储在基数2中,因此小数不可能精确对应于简洁的十进制字符串。为了得到精确的小数,你可能必须先四舍五入。

A。我不这么认为。即使你能得到mantisa(指数值),它也会以2为基数。

此外,浮点数是不精确的,所以如果你没有一个完美的整数,你就有无限的小数位数。当你打印号码时,你看不到他们,因为他们被剪掉了

A.我不这么认为。即使你能得到mantisa(指数值),它也会以2为基数。

此外,浮点数是不精确的,所以如果你没有一个完美的整数,你就有无限的小数位数。当你打印号码时,你看不到他们,因为他们被剪掉了

在您最近一次编辑之后,听起来您只是想进行四舍五入,而不是真正关心数字的小数位数

如果是这种情况,您可以使用如下代码:

#include <math.h>

float computeFare() 
{   
    float totalFare;
    totalFare =  (3.40 + basicFare) * (1 + surchargePercent);
    totalFare = floorf(totalFare * 100 + 0.5) / 100; //round the answer
    return totalFare; // **in this case totalFare = 34.567** 
}  
printf("Total fare is $%.2f\n",              computeFare()); 
#包括
float computeFare()
{   
浮动总票价;
总票价=(3.40+基本费用)*(1+附加费百分比);
totalFare=floorf(totalFare*100+0.5)/100;//将答案四舍五入
返回totalFare;//**在这种情况下,totalFare=34.567**
}  
printf(“总票价为%.2f\n”,computeFare());

在您最近一次编辑之后,听起来您只是想进行四舍五入,而不是真正关心数字的小数位数

如果是这种情况,您可以使用如下代码:

#include <math.h>

float computeFare() 
{   
    float totalFare;
    totalFare =  (3.40 + basicFare) * (1 + surchargePercent);
    totalFare = floorf(totalFare * 100 + 0.5) / 100; //round the answer
    return totalFare; // **in this case totalFare = 34.567** 
}  
printf("Total fare is $%.2f\n",              computeFare()); 
#包括
float computeFare()
{   
浮动总票价;
总票价=(3.40+基本费用)*(1+附加费百分比);
totalFare=floorf(totalFare*100+0.5)/100;//将答案四舍五入
返回totalFare;//**在这种情况下,totalFare=34.567**
}  
printf(“总票价为%.2f\n”,computeFare());

您试图解决什么问题?请查看此链接float computeFare(){totalFare=(3.40+basicFare)*(1+surchargePercent);return totalFare;//在本例中totalFare=34.567}printf(“总票价为$%.2f\n”,computeFare());我这样做了,它返回34.56。。。我希望它是34.57美元。在打印之前,您需要将computeFare四舍五入到最接近的小数点后2位,因为%.2f总是在不舍入的情况下截断。这应该能解决你的问题,我明白了。我怎么能做到呢?有没有C语言的库可以进行舍入