Use integer (categorical) rasters, because their datasets are natively compressed (using a lossless run-length encoding). Compression can often exceed 99%, depending on the complexity of the values: long horizontal strips of constant values compress very well. The extensive NoData cells in your grids are great examples of this.
The problem with this approach is that the values are thereby discretized into integer bins: you only get -2, -1, 0, 1, 2, ..., etc., and cannot represent (say) 3.1415927, as is possible with the single-precision ("binary") float format. A work-around is to use a finer unit of elevation measurement, such as 0.1 ft or 0.1 m or even smaller. The conversion amounts to multiplying the current values (e.g., multiply by 10 to convert from meters to decimeters) and rounding the results. Occasionally you have to convert back for analytical purposes, but often you can avoid conversion simply by changing legends on maps. E.g., when elevations are in decimeters, change a legend panel like "100 - 110" into "10.0 - 11.0" and you're all set.