Aaah - I hadn't been thinking in terms of two different ships "really" having the same size (because components add up slightly differently). I was thinking purely from a computer science point of view: "thou shalt never compare two floats or doubles without using a tolerance" in terms of comparing two ships that are supposed to have exactly the same size (e.g. same components but a different order so they add up differently). Even leaving the jump drive issue out of it, I think there will quite a few places where you end up comparing hull sizes, so I think you should either have a "compare hull sizes" function that takes a required tolerance (or has one hard-wired inside) or you should discretize hull sizes to e.g. 1 ton or 0.1 ton or 1kg increments.
The above then made me realize an important question: "Just how many tons are there in a 1000 ton ship". By this I mean that the calculated tonnage on the design is just an approximation - in the real world the actual size will come out different (and be different for different ships). So in the real world jump drives would be overdesigned to account for this variation. So I think the question here is how to model this variation in the game and how much of it to expose to the user.
Possibly an easier way to explain (while still being codeable) would be that jump drives can propel things up to 1.25x the host vessel's size (up to a maximum of the jump drive's rating). That has two benefits, firstly, you can say that the jump 'bubble' created by the ship can encompass pointy out bits and compensate for hull size mismatches (avoiding the 9999.9999 ton vessel being unable to jump a 10k ton vessel or the handwavium required above to say why a 9980 ton vessel can move a 10k vessel but your 9940 ton example can't).
Secondly, you can make ever so slightly smaller ships and still make use of jump drives you've already designed (eg anything between than 8k-10k tons could make use of a 10k jump drive). This increases flexibility in ship design.
I really like this idea for managing it, except I would make the slosh 5% or even 1% and not advertise it to users (or if you do, point out that this is to account for slop and the extra bit shouldn't be used in designs). So the nominal rating of a jump drive is intended to be able to jump any ship whose nominal tonnage is equal to or less than that rating, and under the covers this allows nominal tonnages that are a bit high to still be jumped.
A more complicated way to manage it (that I'm not keen on) would be to have an "actual size" data member on each ship that randomly fluctuated by e.g. 1% from the design size. You could play the same game with engine power, jump capacity, etc. The upside is that this would give personality to the ships (e.g. a particular ship in the days of sail being known as a fast sailer). The downside is that it would give personality to the ships - paying attention to small variations between ships is nice for single-ship tactical actions, but impractical at the 4X level, plus it forces an extra layer of micro-management on the player in terms of making decisions about just how much they're going to over-engineer jump drives and engines.
John