I looked into this issue further, and found out some things regarding
floats and decimals that I should have known about before I posted.
Namely, that floats do not precisely store numbers like .1 or .2.  So I
don't see any way around the fact that bombing does not grant .2
kills per army bombed exactly everytime.

I also looked into how the client and server interact with regards to kill
updates.  Kills are multiplied by 100 by the server and sent to the
client.  The client then divides by 100 and inputs the value into the
player struct.  Effectively, any decimal places beyond the second are
lost.  Since the kills are stored as a float with many decimal places on
the server, but only to 2 decimal places on the client, this leads to a
case where the server and client calculate differently regarding how many
armies a ship can carry.

I propose then to modify the server code to truncate kills at the second
decimal place when it comes to troop capacity/beam up checking.  The code
change would be as follows (note there is also a similar function in
robot troop capacity logic but did not think this needed to be changed
as robot troop capacity stays server side).

Index: ntserv/daemonII.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/daemonII.c,v
retrieving revision 1.5
diff -r1.5 daemonII.c
2947c2947,2948
<             /* XXX */
---
>             /* Truncate kills to the 2nd decimal place - same procedure used
>              for sending kill packets to clients */
2949c2950
<                 if (j->p_armies == (int)(j->p_kills * 3.0))
---
>                 if (j->p_armies == (int)((float)((int)(j->p_kills*100)/100.0) * 3.0))
2952c2953
<                 if (j->p_armies == (int)(j->p_kills * 2.0))
---
>                 if (j->p_armies == (int)((float)(int)(j->p_kills*100)/100.0) * 2.0))

Index: ntserv/redraw.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/redraw.c,v
retrieving revision 1.2
diff -r1.2 redraw.c
415c415,417
<     troop_capacity = pl->p_kills * (myship->s_type == ASSAULT?3:2);
---
>     /* Truncate kills to the 2nd decimal place - same procedure used
>        for sending kill packets to clients */
>     troop_capacity = (int)((float)((int)(pl->p_kills*100)/100.0) * (myship->s_type == ASSAULT?3:2));