Rund wie eine Null

12

Tor

Runden Sie eine eingegebene Zahl auf die nächste Zahl mit einer signifikanten Zahl ab.

Bedarf

Eingang

  • Eine Gleitkommazahl.
  • Angenommen, die eingegebene Zahl führt zu einer Ausgabe innerhalb der Grenzen des Datentyps (dh, Überlauffehler werden ignoriert.)
  • 0 ist eine ungültige Eingabe.
  • Zahlen, die im Gleitkomma-Datentyp nicht genau dargestellt werden können (z. B. "0.35"als gespeichert 0.3499999), müssen nicht unterstützt werden.

Ausgabe

  • Die nächste Zahl, die aus einer Ziffer ungleich Null und einer beliebigen Anzahl von Nullen besteht.
  • Das Ergebnis muss negative Zahlen und Bruchzahlen unterstützen.
  • Wenn der Eingang genau zwischen zwei möglichen Ausgängen liegt, runden Sie von Null ab.

Präsentation

Der Fokus liegt eher auf der Berechnung als auf der Präsentation. Die Ausgabe kann ein Gleitkomma-Datentyp sein. Es kann sich um einen vollständigen Text oder um einen Text in wissenschaftlicher Notation handeln. Wenn Sie eine Lücke finden, in der die Darstellung einer bestimmten Art die Anzahl Ihrer Bytes verringert, dann ist dies ein großes Lob für Sie!

Beispiele

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

Testfälle

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

Wertung

Der Code mit der geringsten Byteanzahl nach einer Woche gewinnt.

Hand-E-Food
quelle
3
Ich denke, "eine signifikante Zahl" ist der Ausdruck, den Sie suchen.
Steve Bennett
2
Die Rundungsregel für 0 ist ziemlich seltsam.
Xnor
2
@xnor, du hast recht. 0 ist näher an 0,0001 als 1. Ich denke, 0 sollte einfach ungültig sein.
Hand-E-Food
1
Ja, und es stimmt nicht mit der Zielaussage überein.
Steve Bennett

Antworten:

6

MATL , 3 Bytes

1&V

Probieren Sie es online!Oder überprüfen Sie alle Testfälle .

Testfall 0.25 schlägt für den Compiler fehl, der in Octave unter TIO ausgeführt wird, funktioniert jedoch in Matlab unter Windows:

Bildbeschreibung hier eingeben

Das unterschiedliche Verhalten wird durch Octaves / Matlabs verursacht sprintf Funktion , die je nach Plattform entweder "Bankerrundung" oder ".5 von Null entfernt" verwendet. Weitere Informationen und Tests finden Sie hier .


Zum 6 Bytes ,

1t3$Yo

funktioniert sowohl auf Octave als auch auf Matlab. Überprüfen Sie alle Testfälle .

Luis Mendo
quelle
1
"Bankerrundung" hat mich so ziemlich dazu gebracht, meine Gelee-Antwort zu löschen. > _ <
Erik the Outgolfer
@EriktheOutgolfer Ja, ich habe herausgefunden, dass das auch der Grund ist. Ich bin froh, dass Matlab das nicht tut :-D
Luis Mendo
11

C # (.NET Core) , 19 Byte

n=>n.ToString("G1")

Probieren Sie es online!

Beispiele:

Input     Output
----------------
 54321     5E+04
-56789    -6E+04
 99        1E+02
 0.23      0.2
 0.25      0.3
-0.25     -0.3
 4.56e23   5E+23
 4.56e-23  5E-23
Charlie
quelle
9

Javascript, 19 Bytes

x=>x.toPrecision(1)
Steve Bennett
quelle
Dies entspricht nicht der Spezifikation von 0oder 25.
Anders Kaseorg
Interessant. Die Spezifikation für 0ergibt für mich keinen Sinn. Aber die 0.35Sache ... sieht so aus, als ob Javascript versucht, Verzerrungen beim Runden zu vermeiden, aber die Spezifikation will die Verzerrung.
Steve Bennett
Hey, du hast deinen Kommentar geändert - du hast 0.35nicht 25vorher geschrieben. Ich denke, dass es die Spezifikation für 25 erfüllt - es gibt "3e + 1" zurück, was mir richtig erscheint.
Steve Bennett
Entschuldigung, ich habe es von geändert, 0.35da 0.35es keine exakte Gleitkommadarstellung gibt. Das Verhalten muss vom Browser abhängig sein. Ich bekomme 252e+1in Firefox.
Anders Kaseorg
Ja, ich bekomme diese zwei unterschiedlichen Ergebnisse in Chrome vs Firefox. Beeindruckend.
Steve Bennett
4

Retina , 63 62 Bytes

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

Probieren Sie es online!

TwiNight
quelle
Anscheinend müssen Sie sich keine Gedanken über nachfolgende Nullen machen, damit Sie die letzte Stufe vollständig entfernen können (obwohl ich davon beeindruckt bin, sehen Sie nicht an jedem Tag drei Fragezeichen im Abstand von vier Zeichen).
Neil
Leider scheint diese Antwort zu scheitern 0.99.
Neil
Scheitert auch für 0.099usw. Mein Versuch, eine Lösung zu finden: Probieren Sie es online!
Neil
Auch nicht für 99.99, 100.001, ...
Neil
Immer noch falsch für 0.099, sorry. Auf der hellen Seite denke ich kann man das +nach ;der dritten Zeile entfernen .
Neil
2

PHP , 45 Bytes

<?=round($x=$argv[1],-floor(log10(abs($x))));

Probieren Sie es online!

Gleiche Methode wie meine Python 2 Antwort.

Scheint auch richtig damit umzugehen 0.35, was es auch einen Haken über die JS-Antwort setzt: D

Skidsdev
quelle
Interessanterweise funktioniert Ihre gelöschte Python 3-Antwort möglicherweise in Python 2.
Anders Kaseorg,
Getestet, und das tut es! Die Python-Antwort wurde jetzt bearbeitet und wiederhergestellt
Skidsdev,
2

T-SQL, 27 Bytes

SELECT FORMAT(i,'G1')FROM t

Verwenden des gleichen .NET-Formatierungscodes wie die C # -Antwort von Carlos Alejo . Eingang ist aus Float Spalte i in vorbestehenden Tabelle t , gemäß unseren IO - Standards

Testfälle:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(Ziemlich praktisch, dass ich die Eingabetabelle mit all diesen Werten vorladen und sie sofort ausführen kann.)

BradC
quelle
1

Python 2 , 62 Bytes

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

Probieren Sie es online!

Nicht gewohnt, Python zu spielen, aber das funktioniert.

Scheitert an 0.35 aufgrund von Gleitkommaungenauigkeiten.

Vielen Dank an Anders Kaseorg für den Hinweis, dass dies in Python 2 korrekt funktioniert

Skidsdev
quelle
Die Ausgabe für 0.25soll sein 0.3.
Anders Kaseorg
@AndersKaseorg Ich bin mir nicht sicher, warum, aber ich kann nur annehmen, dass dies auf die gleichen Gleitkomma-Ungenauigkeiten zurückzuführen ist wie die Javascript-Antwort.
Skidsdev
Hmm warte 25 hat das selbe Problem ... komisch.
Skidsdev
Für alle, die sich fragen, Python 2 roundrundet von null ab, während Python 3 auf gerade abrundet. Deshalb funktioniert dies in Py2, aber nicht in 3.
Flornquake
Sie können einige Bytes mit log(x,10)anstelle von Golf spielen log10(abs(x)).
Alix Eisenhardt
1

Excel, 14 Bytes

=ROUNDUP(A1,1)
rew
quelle
Willkommen auf der Seite! Dies ist eine schöne erste Antwort. Haben Sie Links zu einer Stelle, die getestet werden kann, vorzugsweise online, damit andere Benutzer Excel nicht herunterladen müssen?
Caird Coinheringaahing
Leider glaube ich nicht, dass es aufgrund der Lizenzierung kostenlose Microsoft-Websites gibt. Ich habe andere Excel-Antworten zu Code Golf gesehen, bin mir aber nicht sicher, wie diese validiert werden, da ich neu bin!
ReW
Das funktioniert in den meisten Testfällen nicht. Es wird auf die Position "Zehntel" aufgerundet. Es muss auf die wichtigste Position abgerundet (nicht aufgerundet) werden.
Hand-E-Food
0

Viertens (viertens) , 24 Bytes

: f 1 set-precision f. ;

Probieren Sie es online!

Die Eingabe wird auf dem Gleitkommastapel erwartet. Die Ausgabe erfolgt auf Standard

Ich mag es nicht, Änderungen an der globalen (in diesem Fall) Genauigkeit der Gleitkomma-Ausgabefunktionen vorzunehmen, aber es spart eine Menge Bytes, um den vorherigen Wert am Ende nicht wiederherstellen zu müssen. Wird unabhängig von der Eingabe nicht in technischer oder wissenschaftlicher Notation ausgegeben.

Hinweis: Aus irgendeinem Grund, den tio Dolmetscher Konvertiten 0.25zu 0.2, während meine lokale Installation Konvertiten 0.25zu 0.3. Ich bin mir nicht ganz sicher, warum das so ist, aber da ich vor Ort das richtige Ergebnis erhalte, lasse ich meine Antwort wie sie ist

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
reffu
quelle