@Mika69 sagte in Zahlen mit Anzahl Nachkommastellen:
Hi! Dieser Kommentar trifft den Nagel auf den Kopf, wenn es um die klassischen Tücken von Fließkommazahlen (float und double) geht. Computer rechnen intern im Binärsystem (Basis 2), weshalb viele alltägliche Dezimalbrüche wie 0,10,10,1 oder 123,12123,12123,12 nicht exakt dargestellt werden können.Deshalb ist der mathematische Weg über Math.Truncate (mit 10n10^n10n multiplizieren, abschneiden, durch 10n10^n10n teilen) meistens die sauberere Wahl für Berechnungen, auch wenn das binäre Restrisiko minimal bleibt. Wenn es dir rein um die Optik geht, ist das Umwandeln in einen String und das anschließende Abschneiden tatsächlich der einzige Weg, um die exakte Dezimaldarstellung zu erzwingen.
Dein vorgeschlagener mathematische Weg geht eben gerade nicht! Da 0.1 nicht als float dargestellt werden kann, nützt es auch nichts, trunc(0.1 * 10) / 10 zu berechnen, denn das Ergebnis passt dann ja immer noch nicht in einen float! 0.1 als float ist ca. 0.10000000149. Mal 10 ist 1.0000000149, abgeschnitten 1. Aber 1 / 10 ist dann was als float? Eben wieder 0.10000000149! Und nun?
die exakte Dezimaldarstellung
Was ist diese exakte Dezimaldarstellung? Wenn ich (vor oder nach deiner Rechnung) den float 0.10000000149 habe, ist dann die exakte Dezimaldarstellung davon 0.1 oder 0.10000000149, etwas dazwischen, oder ganz was anderes? Wäre die Antwort eine andere, wenn die nächstmögliche Binärdarstellung stattdessen so etwas wie 0.0999999975 wäre?
Apropos, die genaueste float-Darstellung von 0.7 ist 0.699999988. Aber trunc(0.699999988 * 10) / 10 ist 0.6000000238. Ist es das, was du von deiner mathematischen Methode willst?
PS: Ich habe die Dezimaldarstellungen in den Zahlenbeispielen nach einer Weile abgeschnitten. Die Zahlen sind zwar alle Dezimal exakt darstellbar (darum geht es ja gerade), aber es bringt ja keinen Mehrwert, wenn ich 0.60000002384185791015625 schreibe statt auf 0.6000000238 zu runden, außer dass es unleserlich wird. Bloß dass niemand denkt, ich könne keine Kommarechnung