在 Windows 中用 C 语言计算百分比
Posted
技术标签:
【中文标题】在 Windows 中用 C 语言计算百分比【英文标题】:Calculating percentage in C in Windows 【发布时间】:2013-04-19 03:45:40 【问题描述】:我有以下代码行来计算计数/总数的百分比。
在 Microsoft Visual C++ 2005 中
printf("Count = %lu (%.2lf%%)\n", count, (double)count/(double)total*100.0);
在 gcc 中
printf("Count = %lu (%.2lf\%)\n", count, (double)count/(double)total*100.0);
“count”和“total”都是无符号的 64 位整数。出于某种原因,我能够在 gcc 中获得正确的值,但在 Visual C++ 中总是获得 0.00%。
为什么我不能在 Windows 中得到正确的值?
【问题讨论】:
【参考方案1】:%lu
打印一个未签名的long int
。在 Visual C++ 中,这是一个 32 位整数,而不是 64 位整数。你说“count”是一个64位整数,所以它不是一个“long int”。 (您肯定已经将其声明为__int64 count;
或long long int count;
,对吧?在Visual C++ 2005 中,您将如何声明一个64 位整数变量?)
由于printf
不知道您传递了哪些参数或它们有多大,它依赖于格式字符串来告诉它为每个参数从堆栈中拉出多少字节的数据。通过编写%lu
,您已经告诉它为“count”删除 4 个字节(32 位)的数据,但是当您将 64 位整数变量“count”传递给printf
。剩下的 4 个字节仍在堆栈上。然后,当printf
去删除“double”的 8 个字节(64 位)作为百分比时,它首先以“count”剩余的 4 个字节结束。由于 Intel x86 CPU 是 little-endian,因此这些字节几乎可以肯定是 00000000。
简答:写 %I64u
或 %llu
在 Visual C++ 中打印一个无符号的 64 位值。
【讨论】:
以上是关于在 Windows 中用 C 语言计算百分比的主要内容,如果未能解决你的问题,请参考以下文章
C语言中如何控制只在某一个位置打印?比如进度百分比数字的显示。
R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签