一小部分四舍五入为零

时间:2014-04-09 18:54:30

标签: c++ casting double

我有以下数值:

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);

它有效。

所有答案都很相似,所以选择一个很难。

2 个答案:

答案 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时才会发生。