Eine wissenschaftliche Erklärung findest du am ehesten im Wiki: Gleitkommazahl ? Wikipedia
Wenn du wissen willst, wie das genau in Java läuft, dann schau am besten in der Java / JVM Spec nach.
Nun kann man theoretisch vor und nach dem Komma beliebig viele Stellen haben.
Klar ist, dass man mit einem begrenzten Speicherumfang (Java float: 32 bit) nicht beliebig viele verschiedene Kommazahlen darstellen kann. (Ist ja bei int nicht anders, das geht von -2147483648 bis 2147483647 und hat auch 32 bit).
Daher werden Zahlen "krumm", weil sie auf den nächsten darstellbaren Wert "gerundet" werden.
Wie wird es nun gespeichert: Man stellt die Zahl als m * b ^ e dar (m ... Mantisse, b ... Basis, e ... Exponent). Die Basis ist in unserem Fall 2 (per Definition), wir haben nun 32 bit, die wir zwischen Mantisse und Exponent "aufteilen" können.
D.h. vorher ziehen wir noch 1 bit ab, für + oder -, und dann legen wir fest (weil das kluge Menschen von IEEE mal so gemacht haben): m bekommt 23 bits, e bekommt 8 bits.
Hier mal ein wenig Java-Code, damit wir deine Zahl in dieser Darstellung sehen:
Java:
publicstaticvoidmain(String[] args)throwsIOException,InterruptedException{int y =Float.floatToIntBits(1123.15f);String s =Integer.toString(y,2);if(s.length()<32){
s ="0"+ s;}System.out.println(s);}
Das sollte diesen Output erzeugen: 01000100100011000110010011001101
Das erste bit ist das Vorzeichen.
Die nächsten 8 bit (10001001) sind der exponent, wobei dieser um 127 reduziert werden muss. e = 137 - 127 = 10.
Die nächsten 23 bit sind die Mantisse, wobei die immer mit einer gedachten 1. vorangestellt läuft, d.h. wir haben m = 1,00011000110010011001101.
Die Zahl lautet also 1,00011000110010011001101 * 2^10, d.h. wir schieben das Komma um 10 nach rechts und bekommen: 10001100011,0010011001101.
Der Vorkommateil ist 10001100011 oder eben 1123
Der Nachkommateil ist: 0,0010011001101 oder 0,150024414 und daher kommt deine "krumme Zahl".