我正在用C语言编写一个程序。
有没有办法确定小数位数
在一个浮点数(即0.123 = 3
,0.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美元
谢谢, 劳伦斯。
答案 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());