As Brian mentioned, there is something called a FFT (Fast Fourier Transform). It takes a time snippet of signal and returns the amplitude of frequency components in buckets of predetermined frequency and bandwidth. The FFT algorithm is a computationally optimized general Fourier transform that operates on a power of two frequency buckets linearly spread from 0 to the high end of the frequency range it is configured for.
A FFT is computationally expensive, and can only be done on fixed chunks of time domain signal. If you want to get a general frequency content, then it can be appropriate. If you just want to detect the presence of a small number of specific and known frequencies, then it's probably not appropriate. A example of the latter would be DTMF (touch tone) decoding since there are only 8 specific frequencies and you generally want to do the tone decoding continuously, and the frequencies are fairly closely spaced.
To detect the amplitude of a specific frequency in a composite signal, multiply that signal by the sine and cosine of the desired frequency. Low pass filter each of these two product signals separately. The bandwidth of this filter is half the bandwidth the frequency of interest will be detected within. Another way of putting that is that this is the bandwidth of the resulting amplitude output. Now square the two low pass filtered signals and add them together. The result is the square of the amplitude of the signal of interest. You can see where I've simulated this with three adjacent DTMF tones:
The input signal was three adjacent DTMF frequencies for 50ms each with 50ms gaps between. The detection frequency was set up to match the center burst. The blue line is the resulting amplitude squared signal. The low pass filter time constants were adjusted to reject the adjacent frequencies, but still respond well enough within 50 ms (the minimum valid DTMF tone length).
If you need true amplitude, then you'd have to take the square root of the result shown here. For simply detecting the presence of a particular frequency, the magnitude squared is good enough. For other applications the true magnitude may be necessary.
Your FM radio works because it receives a band of frequencies around the frequency it shows or that you tune it at. As you say, the nature of FM means that the frequency will vary. However, the extent of these variations is well defined, and the radio is designed to "find" the carrier anywhere in this range.
This may surprise you, but AM also requires the receiver to pick up a range. I'm not going to go into Fourier analisys right now, but basically changing amplitude is adding frequencies. Put another way, a true pure single frequency can't ever change in amplitude and can't carry any information.
The way AM works, there is a frequency band on either side of the carrier that is the width of the highest frequency that can be transmitted. For example, if the signal being modulated onto the AM carrier can be up to 10 kHz, then there is a 10 kHz band of stuff on either side of the carrier. In fact, the carrier is constant and the actual information is in these side bands. Yes, I know that may be unintuitive, but at the level you are asking and what I have time to explain here you'll just have to trust me on this. Look up Fourier analisys if you want to learn more.
For example a AM radio station a 1 MHz carrying up to 10 kHz content will have a signal spread out over the range of 990 kHz to 1.01 MHz.
Best Answer
The government decides the frequencies. In the United States, it's decided by the FCC in coordination with the ITU, which is the international governing body (since radio waves don't magically stop at the borders of countries).
There's nothing particular about FM that makes it more suited to those frequencies compared to others. In fact, ham radio operators and others use FM on many different frequency bands. Probably when FM broadcasting needed some spectrum, the 88 - 108 MHz was the most convenient at the time, for technological or political reasons.