static_cast <int> (std::floor(x));
macht ziemlich genau, was Sie wollen, ja. Es gibt Ihnen die nächste Ganzzahl, gerundet auf -infinity. Zumindest solange Ihre Eingabe in dem Bereich liegt, der durch Ints dargestellt werden kann. Ich bin nicht sicher, was Sie meinen, indem Sie .5 und whatnot hinzufügen, aber es wird nicht den gleichen Effekt haben
Und std :: floor gibt ein Doppel zurück, weil das das allgemeinste ist. Manchmal möchten Sie vielleicht ein Float oder Double abrunden, aber den Typ beibehalten. Das heißt, rund 1.3f zu 1.0f, anstatt zu 1.
Das wäre schwer zu tun, wenn std :: floor ein Int. (oder zumindest hat man eine extra unnötige Besetzung, die die Dinge verlangsamt).
Wenn floor nur die Rundung selbst ausführt, ohne den Typ zu ändern, können Sie dies bei Bedarf in int umwandeln.
Ein weiterer Grund ist, dass der Bereich der Doppel viel größer ist als der von Ints. Es kann nicht möglich sein, alle Doubles auf Ints zu runden.
Also, wenn es im richtigen Bereich ist, die Besetzung ist in Ordnung Wo es (etwas, das bedeutet) sagt dies in der Spezifikation? ? –
Nun, es gibt zwei Operationen hier: std :: floor, und die Besetzung. Std :: floor soll eine ganze Zahl zurückgeben, und die Besetzung wird in Form eines ganzzahligen Wertes angegeben, solange std :: floor zurückkommt ein Wert, der wirklich eine exakte ganze Zahl ist, I ca nicht sehen, wie es sinnvoll wäre, dass es scheitert. –
Wie würde Stock jemals etwas zurückgeben, das keine exakte ganze Zahl ist? Für kleine Doubles (epsilon << 1) können alle ganzzahligen Werte dargestellt werden, einschließlich floor (x). Für große Doppel (epsilon >> 1) können nur ganzzahlige Werte dargestellt werden, also floor (x) == x. – MSalters