1

我正在用 C 编写一个程序。

有没有办法确定浮点数中的小数位数(即0.123 = 30.123456 = 6)?

除了将数字转换为字符串并使用字符串函数提取小数点后的字符之外?

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

float computeFare()
{
  totalFare =  (3.40 + basicFare) * (1 + surchargePercent);
  return totalFare; // **in this case totalFare = 34.567**
}

printf("Total fare is $%.2f\n", 
            computeFare());

结果:总票价为 $34.56

我这样做了,它返回 34.56... 我希望它是 34.57 美元

谢谢,劳伦斯。

4

5 回答 5

5

并非如此,小数位数是数字内部表示的函数。当您显示数字时,您看到的是数字作为打印字符串。

因此,如果您对显示的值感兴趣,您可以首先使用格式化指令来控制小数位数,例如%5.2f,或者使用您在帖子中提到的字符串函数方法,一旦您将数字作为细绳。

另外,顺便说一句,你会计算尾随零吗?

也许说明您想要这样做的目标会有所帮助?可能还有其他方法可以完成您想做的事情。

更新

根据您的更新,问题实际上不在于计算小数位,而是您遇到了表示问题/舍入错误(并不罕见)。问题是某些小数值不能以 2 为底精确表示。这里有一个详尽的解释:What Every Computer Scientist Should Know About Floating-Point Arithmetic

看看这个 SO 问题:Understanding floating point representation errors;我的想法有什么问题?

您可以尝试这种方法来舍入该值:

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

维基百科有一整篇关于舍入的文章。

于 2012-09-04T12:37:04.837 回答
4

这些数字(通常)以 2 为底数存储,因此小数不太可能与简明的十进制字符串精确对应。为了得到整齐的小数,您可能必须先四舍五入。

于 2012-09-04T12:39:39.627 回答
2

printf您可以指定小数位数。

  • %.0f不等于小数位
  • %.4f等于浮点数,显示四位小数
于 2012-09-04T12:37:27.383 回答
1

答:我不这么认为。即使你能得到尾数(指数值),它也会以 2 为底。
B. 此外,浮点数不准确,所以如果你没有完美的整数,你有无限个小数位. 当您打印数字时您不会看到它们,因为它们会被削减。

于 2012-09-04T12:42:52.917 回答
0

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

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

#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()); 
于 2012-09-04T13:09:26.137 回答