我正在为一所学校的实验室工作,这个实验室运行着10000张5张牌的10条步道。我必须在每只手中找到冲洗和成对。我必须找到每条线索的对和冲洗的百分比。
我的问题是当我试图获得一对一条路径的百分比时,例如
double percent = total_pairs/10000;
或
double percent = 5600/10000;
当我想要打印出2位小数时,我的输出变为0,我得到以下
0.00
使用此代码
cout<<setiosflags(ios::fixed | ios::showpoint);
cout<<setprecision(2)<<percent<<endl;
但是我仍然得到零我得到的实际数字是这样的
double percent = (double) 5600/10000;
这是正确的,因为我不希望它截断我的输出或我错过了什么
希望你能理解我。答案 0 :(得分:8)
是的,就是这种情况,下面执行整数除法。然后将结果(0)转换为double。
double percent = 5600/10000
下面一行强制5600为双倍,所以现在你有实际的双打分区
double percent = (double) 5600/10000
如果你的一个数字是常数,你可以确保使用十进制格式来强制浮点除法:
double percent = 5600.0/10000
我有时使用的另一个技巧是乘以1.0,将后面的内容转换为double:
double percent = 1.0 * inta / intb
答案 1 :(得分:7)
“total_pairs”是否为int?如果是这样,则除以整数除法。您需要将其中一个数字显式地转换为double(另一个将自动提升为double):
double percent = ((double)total_pairs)/10000; // or just simply 10000.0
答案 2 :(得分:2)
除以整数给出一个C和C ++的整数(我不确定相应操作的正确英文单词,但10/4给你2等,这是除法的整数部分)。以下是:
double a = 1000 / 10000;
首先计算,作为int,1000/10000(在这种情况下为0),然后将其转换为double。
转换参数是一种方式 - 我更喜欢自己输入float而不是整数,但这是个人偏好:
double a = 1000. / 10000.;
(只有一个就够了:那就是1000 / 10000.也可以。)
答案 3 :(得分:2)
您的代码存在问题:
double percent = (double) 5600/10000;
您是否假设类型转换适用于5600.它没有。实际发生的是分裂完成(并截断,因为两个数字都是整数),然后最终结果被转换为double。所以,你得到截断的结果。上面的代码相当于:
double percent = (double) (5600/10000);
分区根据需要运行所需的是分子(第一个数字)为double。您可以通过将转换包装在括号中来完成此操作
double percent = ((double) 5600)/10000;
如果分子实际上是变量,那么更有用。或者,如果要处理数字常量,可以在数字的末尾加上小数位。
double percent = 5600.0/10000;