Redondo como un cero

12

Objetivo

Dado un número de entrada, redondee al número más cercano con una cifra significativa.

Requisitos

Entrada

  • Un número de coma flotante.
  • Suponga que el número de entrada da como resultado una salida dentro de los límites del tipo de datos (es decir, ignore los errores de desbordamiento).
  • 0 es una entrada no válida.
  • Los números que no se pueden representar con precisión en el tipo de datos de coma flotante (por ejemplo, "0.35"almacenados como 0.3499999) no tienen que ser compatibles.

Salida

  • El número más cercano que consta de un dígito distinto de cero y cualquier número de dígitos cero.
  • El resultado debe admitir números negativos y números fraccionarios.
  • Cuando la entrada se encuentra exactamente entre dos salidas posibles, redondee desde cero.

Presentación

El foco está en el cálculo más que en la presentación. La salida puede ser un tipo de datos de punto flotante. Puede ser texto completo o en notación científica. Si encuentra una escapatoria en la que presentar de cierta manera reduce su número de bytes, ¡felicitaciones!

Ejemplos

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

Casos de prueba

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

Puntuación

El código con el menor recuento de bytes después de una semana gana.

Hand-E-Food
fuente
3
Creo que "una figura significativa" es la frase que estás buscando.
Steve Bennett
2
La regla de redondeo para 0 es bastante extraña.
xnor
2
@xnor, tienes razón. 0 está más cerca de 0.0001 que 1. Creo que 0 simplemente debería ser inválido.
Hand-E-Food
1
Sí, y no coincide con la declaración de objetivos.
Steve Bennett

Respuestas:

6

MATL , 3 bytes

1&V

Pruébalo en línea! O verificar todos los casos de prueba .

El caso de prueba 0.25falla para el compilador que se ejecuta en Octave en TIO, pero funciona en Matlab en Windows:

ingrese la descripción de la imagen aquí

El comportamiento diferente es causado por la función de Octave / Matlab sprintfusando el redondeo de "banquero" o ".5 lejos de cero", dependiendo de la plataforma. Más información y pruebas se pueden encontrar aquí .


Para 6 bytes ,

1t3$Yo

funciona tanto en Octave como en Matlab. Verifique todos los casos de prueba .

Luis Mendo
fuente
1
"redondeo bancario" es más o menos lo que me hizo eliminar mi respuesta de Jelly. > _ <
Erik the Outgolfer
@EriktheOutgolfer Sí, descubrí que esa era la razón también. Tengo suerte de que Matlab no haga eso :-D
Luis Mendo
11

C # (.NET Core) , 19 bytes

n=>n.ToString("G1")

Pruébalo en línea!

Ejemplos:

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
fuente
9

Javascript, 19 bytes

x=>x.toPrecision(1)
Steve Bennett
fuente
Esto no satisface la especificación en 0o 25.
Anders Kaseorg
Interesante. La especificación para 0no tiene sentido para mí. Pero la 0.35cosa ... parece que Javascript está tratando de evitar el sesgo en el redondeo, pero la especificación quiere el sesgo.
Steve Bennett
Oye, cambiaste tu comentario, escribiste 0.35no 25antes. Creo que satisface la especificación para 25: devuelve "3e + 1", lo que me parece correcto.
Steve Bennett
Lo siento, lo cambié 0.35porque 0.35no tiene una representación exacta de punto flotante. El comportamiento debe depender del navegador; Me sale 252e+1en Firefox.
Anders Kaseorg
Sí, obtengo esos dos resultados diferentes en Chrome vs Firefox. Guau.
Steve Bennett
4

Retina , 63 62 bytes

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

Pruébalo en línea!

TwiNight
fuente
Aparentemente, no tiene que preocuparse por los ceros finales para poder eliminar por completo la última etapa (aunque estoy impresionado por ello, no todos los días se ven tres signos de interrogación en el espacio de cuatro caracteres).
Neil
Lamentablemente, esta respuesta parece fallar 0.99.
Neil
También falla por 0.099etc. Mi intento de solución: ¡ Pruébelo en línea!
Neil
También falla por 99.99, 100.001...
Neil
Todavía mal por 0.099, lo siento. En el lado positivo, creo que puedes eliminar el +después ;de la tercera línea.
Neil
2

PHP , 45 bytes

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

Pruébalo en línea!

El mismo método que mi respuesta de Python 2.

También parece manejarse correctamente 0.35, lo que lo coloca también sobre la respuesta JS: D

Skidsdev
fuente
Curiosamente, creo que su respuesta eliminada de Python 3 puede funcionar en Python 2.
Anders Kaseorg
Probado, y lo hace! Editado y borrado la respuesta de Python ahora
Skidsdev
2

T-SQL, 27 bytes

SELECT FORMAT(i,'G1')FROM t

Usando el mismo código de formato .Net que la respuesta C # de Carlos Alejo . La entrada es de la columna flotante i en la tabla t preexistente , según nuestros estándares IO

Casos de prueba:

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

(Es bastante útil que pueda precargar la tabla de entrada con todos estos valores y ejecutarlos de una vez).

BradC
fuente
1

Python 2 , 62 bytes

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

Pruébalo en línea!

No estoy acostumbrado al golf en pitón, pero esto funciona.

Falla 0.35debido a imprecisiones de coma flotante.

Gracias a Anders Kaseorg por señalar que esto funciona correctamente en Python 2

Skidsdev
fuente
Se 0.25supone que la salida para ser 0.3.
Anders Kaseorg
@AndersKaseorg No estoy seguro de por qué, pero solo puedo suponer que se debe a las mismas imprecisiones de coma flotante que la respuesta de Javascript.
Skidsdev
Hmm, espera 25 tiene el mismo problema ... raro.
Skidsdev
Para cualquiera que se pregunte, de Python 2 roundrondas lejos de cero, mientras que Python 3 rondas incluso, que de por qué esto funciona en Py2 pero no 3.
flornquake
puedes jugar unos pocos bytes usando en log(x,10)lugar de log10(abs(x)).
Alix Eisenhardt
1

Excel, 14 bytes

=ROUNDUP(A1,1)
rew
fuente
Bienvenido al sitio! Esta es una buena primera respuesta, ¿tiene algún enlace a algún lugar que pueda probarse, preferiblemente en línea, para que otros usuarios no tengan que descargar Excel?
caird coinheringaahing
Lamentablemente, no creo que haya ningún sitio gratuito de Microsoft debido a las licencias, lo siento. ¡He visto otras respuestas de Excel en Code Golf pero no estoy seguro de cómo se validan ya que soy nuevo!
Rew
Eso no funciona para la mayoría de los casos de prueba. Se está redondeando a la posición de "décimas". Necesita redondear (no subir) a la posición más significativa.
Hand-E-Food
0

Adelante (gforth) , 24 bytes

: f 1 set-precision f. ;

Pruébalo en línea!

Se espera una entrada en la pila de coma flotante. La salida es stdout

No me gusta hacer cambios en la precisión global (para esta instancia) de las funciones de salida de coma flotante, pero ahorra muchos bytes para no tener que restaurar el valor anterior al final. No sale en notación de ingeniería o científica, independientemente de la entrada.

Nota: Por alguna razón, el intérprete de tio se convierte 0.25a 0.2, mientras que mi instalación local se convierte 0.25a 0.3. No estoy completamente seguro de por qué esto es así, pero como obtengo el resultado correcto localmente, dejo mi respuesta tal como está

: 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
fuente