float r = 5.0;

O valor 5,0 é um número representado como uma fração decimal (tem um inteiro e uma parte fracionária). Na ciência da computação, esses números são chamados de reais.
Um número real é um número que tem uma parte inteira e uma parte fracionária. As partes inteiras e fracionárias osão separadas umas das outras vírgula.
Mesmo que a parte fracionária do número seja zero, como na variável r  do exemplo, o tradutor ainda criará uma variável real na memória. O ponto serve como um sinal para o tradutor de que é necessário criar uma variável real. 

Números muito grandes e muito pequenos  são escritos usando "ponto flutuante" (no chamado formato científico).  
No formato científico, um número é representado como mantissa(parte significativa do número) e expoente. Ao escrever, a mantissa e o expoente são separados um do outro pela letra e (denotando 10 em algum grau). 
Por exemplo, você pode armazenar o valor da carga de um elétron ( \(1.60217662 \times 10^{-19}\) C) em um variável, escrevendo da seguinte forma:
float El = 1,60217662e-19 // para uma ordem positiva, o sinal + pode ser omitido

Quase todos os números reais não podem ser armazenados na memória do computador com precisão perfeita, pois um número limitado de bits é alocado para seu armazenamento. Portanto, ao calcular com números reais, os erros associados à imprecisão da representação se acumulam. Além disso, quanto menos espaço alocado, maior será esse erro. Para diminuir o erro em C#, eles usam o tipo double, que armazena um número real com precisão dupla na memória (ocupa oito bytes de memória, enquanto o tipo float > - 4 bytes).