Runde ein Schwimmer auf einem regelmäßigen raster mit vordefinierten Punkte
Möchte ich um eine float-Zahl um eine gegebene Genauigkeit, zum Beispiel :
0.051 i want to convert it to
0.1
0.049 i want to convert it to
0.0
0.56 i want to convert it to
0.6
0.54 i want to convert it to
0.5
Ich kann es besser erklären, aber der Grund dafür ist, das übersetzen ein Ort (wie 0.131 f, 0.432 f), um die Lage der Fliesen in einem raster (wie 0.1 f, 0.4 f).
- Rundung eine floating-point-Zahl von 1 oder mehr Nachkommastellen ergibt nicht viel Sinn; eine Zahl, wie
0.1
können nicht exakt dargestellt werden, die in binary floating-point. Die Rundung kann getan werden, auf die Ausgabe (zu einem string oder in einer Datei). - Wir sind in der IT-Abteilung sind wir darzustellen versuchen, die unendlichen Möglichkeiten der realen Welt in den Zeilen von code, alles macht hier Sinn. Ich bin mit diesem für ein infinite-scrolling hintergrund in einem Spiel, verloren die Genauigkeit ist nicht wirklich wichtig.
- Ich habe getestet, und es scheint nicht richtig funktioniert. Wenn Sie versuchen, Runde 127, es gibt 128 (ich verwende double statt float für f und für den Rückgabetyp).
- Sie wurden nicht der Punkt der Funktion ,was ist die Präzision, die Sie auf der Durchreise sind? wenn Sie 2 erhalten Sie 128 verursachen, erhalten Sie die nächste Nummer aus 0,2,4,6...,128,130...(2 als Inkrement),wenn Sie pass 127.456 und Präzision 0.01 f erhalten Sie 127.46 Ursache 127.46 ist in der Nähe von 0,0.01,0.02 f.....127.45,127.46,127.47(0.01 als Inkrement)
- Gut in diesem Fall Sie richtig sind, so rundet die Funktion auf die nächste pair-Nummer, und ich bin mit 2 als Präzision. Dennoch, ich denke der Titel der Frage mag irreführend sein. Meiner Meinung nach, und unter Berücksichtigung anderer Implementierungen der Runde in anderen Programmiersprachen, Präzision bezieht sich auf die Anzahl der Dezimalstellen.
- der Titel scheint irreführend zu sein, aber ich konnte nicht finden, einen besseren Titel zu der Zeit.
- kommen Sie hier) diese Frage ist nicht ein Duplikat deiner Frage, ich würde vorschlagen, un-löschen Ihrer Frage. Diese Frage ändert der Schwimmer und macht auch keine Lösung für das Problem angezeigt. Die Lösung des Problem ist eine andere Angelegenheit und erfordert keine änderung der Schwimmer.
- Runden von zahlen innerhalb des Programms macht Sinn, wenn Sie verlieren Präzision und müssen vergleichen Sie das Ergebnis mit etwas. Beispiel, wenn Sie multiplizieren eine matrix (intern ein double-array) für die invertierte sollten Sie die identity-matrix, aber wie können Sie verlieren Präzision innerhalb der Multiplikations-routine, die Sie bekommen können auch kleine Stückzahlen in Orten, die Sie bekommen sollte Nullen. Wenn Sie versuchen, vergleichen Sie das Ergebnis mit einer realen Identität-matrix, erhalten Sie ein FALSE statt eines zu erwartenden WAHR. So Runden die Multiplikation Ergebnis kann eine gute Idee sein, in diesem Fall. Mein Weg zur Runde:
#define ROUND(n,p) round(n*pow(10,p))/pow(10,p)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Solange Ihr grid ist die regelmäßige, nur eine Umwandlung von Ganzzahlen in dieses raster. Also lasst uns sagen, dein Netz ist
Dann Runde durch
Standard
ceil()
,floor()
Funktionen nicht haben, a Präzision, ich denke, könnte das umgehen, indem Sie Ihre eigenen Präzision - das kann aber zu Fehlern - z.B.Ich denke, man könnte testen, um zu sehen, ob dies zuverlässig für Sie?
Einen Algorithmus, die Sie verwenden können:
EDIT 1: ich war auf der Suche nach Lösungen für numpy python und wusste gar nicht, dass der OP gefragt, für C++ haha, naja.
EDIT 2: Lol, sieht aus wie ich nicht einmal die Adresse deiner ursprünglichen Frage. Es sieht aus wie Sie wirklich wollen, um zu Runden nach dezimal (der Betrieb ist unabhängig von der angegebenen Zahl), nicht, a Präzision (der Betrieb ist abhängig von der Anzahl), und die anderen haben schon angesprochen, dass.
Ich war eigentlich auf der Suche rund um für diese zu, konnte aber etwas nicht finden, so warf ich zusammen eine Implementierung für numpy-arrays. Es sieht aus wie es implementiert die Logik, dass slashmais angegeben.
Hier ist ein C++ scalar version als gut, und wahrscheinlich könnte man etwas tun, ähnlich wie oben mit Hilfe von Eigen (Sie haben logische Indizierung): (ich nahm auch dies als eine chance, noch etwas zu üben boost haha):
Ausgabe:
Verwenden
floor()
undceil()
.floor
konvertiert einen float auf die nächste kleinere ganze Zahl, undceil
auf die nächst höhere:Ich denke, die folgenden funktionieren würde:
floor( f + 0.5 )
wird aufgerundet auf eine ganze Zahl. Durch die erste Multiplikation mit 10 und dann dividieren des Ergebnisses durch 10 Runden in Schritten von 0,1.In der Regel wissen Sie das gewünschte Präzision bei der Kompilierung. Deshalb wird die Verwendung der Vorlagen-Pow-Funktion zur Verfügung hier, die Sie tun können:
Getestet hier.
Das Ergebnis zeigt auch, wie ungenau ist die Gleitkommadarstellung 🙂
Können Sie bessere Ergebnisse durch doppelte:
Gedruckt mit Präzisions-20:
Werde ich kurz die Optimierung auf die letzten Antworten, die Umwandlung der Eingabe-Zahl in eine double erste, um überlauf zu verhindern. Ein Probe-Funktion (nicht zu hübsch, aber funktioniert Prima):
Seit Muhen Ente bearbeitet meine Frage und entfernt den code sagen, Fragen sollte nicht enthalten die Antworten (verständlich), Schreibe ich die Lösung hier:
Algorithmus zum Runden von float-Zahl:
Können Sie Runden eine Zahl auf eine gewünschte Präzision mit der folgenden Funktion
Schauen Sie sich einige Beispiele unten...
1)
2)
3)
4)
Diese Funktion funktioniert auch für zahlen mit 9 Präzision.
5)