float r = 5.0 ;

La valeur 5.0 est un nombre représenté sous forme de fraction décimale (a un nombre entier et une partie fractionnaire). En informatique, ces nombres sont appelés réels.
Un nombre réel est un nombre qui a une partie entière et une partie fractionnaire. Les parties entière et fractionnaire osont séparées les unes des autres virgule.
Même si la partie fractionnaire du nombre est zéro, comme dans la variable r  dans l'exemple, le traducteur créera toujours une variable réelle en mémoire. La période sert de signal au traducteur qu'il est nécessaire de créer une variable réelle. 

Nombres très grands et très petits  sont écrits en "virgule flottante" (au format dit scientifique).  
Au format scientifique, un nombre est représenté par une mantisse(partie significative du nombre) et un exposant. Lors de l'écriture, la mantisse et l'exposant sont séparés l'un de l'autre par la lettre e (indiquant 10 dans une certaine mesure). 
Par exemple, vous pouvez stocker la valeur de la charge d'un électron ( \(1.60217662 \times 10^{-19}\) C) dans un variable, s'écrivant sous la forme suivante :
float El = 1,60217662e-19 // pour un ordre positif, le signe + peut être omis

Presque tous les nombres réels ne peuvent pas être stockés dans la mémoire de l'ordinateur avec une précision parfaite, car un nombre limité de bits est alloué pour leur stockage. Par conséquent, lors du calcul avec des nombres réels, les erreurs liées à l'imprécision de la représentation s'accumulent. De plus, moins il y a d'espace alloué, plus cette erreur sera importante. Afin de réduire l'erreur en C#, ils utilisent le type double, qui stocke un nombre réel avec double précision en mémoire (occupe huit octets en mémoire, tandis que le type float > - 4 octets).