As Guy said there are numerous lossless compression methods. Every method has its positives and negatives, and one must choose one with respect of the initial data. Generally, the DEFLATE algorithm for continuous raster data serves very well.
Usually the raster file size depends on the accuracy of each cell. Integer data types for example cost much less that float32. But the int type can hold only integers but float keeps the fraction part of the number. You also have flavors, meaning how many bits you choose to utilize (int4, int8, int16, int32 etc..) for you datatype. And depending on the flavor you have upper and lower limits.
As a practical example, if you have a classification raster, where each raster cell corresponds to a class, you don't need to save your raster as a float32 (which many applications have a default), but the data type int serves you very well also. the resulting raster will be if you combing it with a compression algorithm of a few megabytes where if you had chosen to save it as a float and without using any compression techniques the final size would be measured in hundreds of megabytes.
At end of the day it all comes down your initial datatypes and how much accuracy you want to preserve.