如何确定一个数字中的小数位数?

时间:2012-09-04 12:34:21

标签: c decimal

我正在用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美元

谢谢, 劳伦斯。

5 个答案:

答案 0 :(得分:5)

实际上,小数位数是数字内部表示的函数。显示数字时看到的是,作为打印字符串的数字。

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

另外,除此之外,你会计算尾随零吗?

也许说出你想要这样做的目标会有所帮助吗?可能还有其他方法可以实现您的目标。

<强>更新

根据您的更新,问题实际上不计算小数位数,而是您遇到代表问题/舍入错误(不常见)。问题是某些小数值无法在基数2中准确表示。这是一个详尽的解释:What Every Computer Scientist Should Know About Floating-Point Arithmetic

看看这个问题:Understanding floating point representation errors; what's wrong with my thinking?

您可以尝试使用此方法来舍入值:

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

Wikipeadia在rounding上有一整篇文章。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

使用printf,您可以指定小数位数。

  • %.0f等于无小数位
  • %.4f等于浮动显示四位小数

答案 3 :(得分:1)

一个。我不这么认为。即使你能得到mantisa(指数值),它也会在基数2中 B.此外,浮点数不准确,所以最有可能的是,如果你没有一个完美的舍入数,那么你有无限的小数位数。打印数字时你不会看到它们,因为它会被切断。

答案 4 :(得分: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());