我有以下数值:
i->fitness = 160
sum_fitness = 826135
我做了手术:
i->roulette = (int)(((i->fitness / sum_fitness)*100000) + 0.5);
但我一直在0
获得i->roulette
。
我还尝试将i->fitness / sum_fitness
保存在double
变量中,然后才应用其他操作,但这也会获得0
。
我认为这是因为160/826135
是一个如此之小的数字,然后将其四舍五入为0
。
我怎样才能克服这个?
谢谢
修改
谢谢大家,我最终做到了这一点:
double temp = (double)(i->fitness);
i->roulette = (int)(((temp / sum_fitness)*100000) + 0.5);
它有效。
所有答案都很相似,所以选择一个很难。
答案 0 :(得分:2)
我认为这是因为
160/826135
是一个如此之小的数字,然后将其四舍五入为0
。
整数除法,截断到整数部分。是的,它是0
,但没有四舍五入。 99/100
也是0
。
您可以通过将分子或分母转换为double
:
i->roulette = ((i->fitness / static_cast<double>(sum_fitness))*100000) + 0.5;
答案 1 :(得分:2)
你排队
i->roulette = (int)(((i->fitness / sum_fitness)*100000) + 0.5);
将值转换为int,这就是截断任何float操作的原因 尝试
i->roulette = (((i->fitness / sum_fitness)*100000) + 0.5);
并确保'sum_fitness'或'i-&gt; fitness'属于float或double类型,以使除法成为浮点除法 - 如果它们不是,则需要先抛出其中一个分开,像这样
i->roulette = (((i->fitness / (double)sum_fitness)*100000) + 0.5);
如果你想把它作为整数计算,你也可以尝试改变除法和乘法的顺序,比如
i->roulette = ( i->fitness *100000) / sum_fitness;
只要你没有得到任何整数溢出就会起作用,在你的情况下只有当健康风险超过2000000时才会发生。