Redondo como um Zero


12

Objetivo

Dado um número de entrada, arredonde-o para o número mais próximo com um número significativo.

Exigências

Entrada

  • Um número de ponto flutuante.
  • Suponha que o número da entrada resulte em uma saída dentro dos limites do tipo de dados (por exemplo, ignore erros de estouro).
  • 0 é uma entrada inválida.
  • Números que não podem ser representados com precisão no tipo de dados de ponto flutuante (por exemplo, "0.35"sendo armazenados como 0.3499999) não precisam ser suportados.

Resultado

  • O número mais próximo que consiste em um dígito diferente de zero e qualquer número de zero dígitos.
  • O resultado deve suportar números negativos e números fracionários.
  • Quando a entrada estiver exatamente entre duas saídas possíveis, arredonde para zero.

Apresentação

O foco está no cálculo, e não na apresentação. A saída pode ser um tipo de dados de ponto flutuante. Pode ser texto na íntegra ou em notação científica. Se você encontrar uma brecha na qual a apresentação de uma certa maneira reduz a contagem de bytes, parabéns!

Exemplos

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

Casos de teste

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

Pontuação

O código com o menor número de bytes após uma semana vence.


3
Eu acho que "uma figura significativa" é a frase que você está procurando.
21817 Steve Bennett

2
A regra de arredondamento para 0 é bastante estranha.
Xnor

2
@xnor, você está certo. 0 é mais próximo de 0.0001 que 1. Eu acho que 0 deve ser simplesmente inválido.
Hand-E-Food

1
Sim, e não corresponde à declaração de objetivo.
21817 Steve Bennett

Respostas:


6

MATL , 3 bytes

1&V

Experimente online! Ou verifique todos os casos de teste .

O caso de teste 0.25falha para o compilador em execução no Octave no TIO, mas funciona no Matlab no Windows:

insira a descrição da imagem aqui

O comportamento diferente é causado pela função da Octave / Matlab sprintfusando o arredondamento "banqueiro" ou ".5 longe de zero", dependendo da plataforma. Mais informações e testes podem ser encontrados aqui .


Por 6 bytes ,

1t3$Yo

funciona tanto no Octave quanto no Matlab. Verifique todos os casos de teste .


1
"arredondamento de banqueiro" é praticamente o que me fez excluir minha resposta de geléia. > _ <
Erik the Outgolfer

@EriktheOutgolfer Sim, descobri que esse também era o motivo. Eu tenho sorte que o Matlab não faz isso :-D
Luis Mendo


9

Javascript, 19 bytes

x=>x.toPrecision(1)

Isso não atende à especificação de 0ou 25.
Anders Kaseorg

Interessante. A especificação para 0não faz sentido para mim. Mas a 0.35coisa ... parece que o Javascript está tentando evitar o viés no arredondamento, mas a especificação quer o viés.
21817 Steve Bennett

Ei, você mudou seu comentário - você 0.35não escreveu 25antes. Eu acho que satisfaz as especificações para 25 - retorna "3e + 1", o que me parece correto.
21817 Steve Bennett

Desculpe, eu mudei de 0.35porque 0.35não tem representação exata de ponto flutuante. O comportamento deve ser dependente do navegador; Recebo 252e+1no Firefox.
Anders Kaseorg

Sim, eu recebo esses dois resultados diferentes no Chrome x Firefox. Uau.
21817 Steve Bennett

4

Retina , 63 62 bytes

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

Experimente online!


Aparentemente, você não precisa se preocupar com zeros à direita para remover completamente o último estágio (embora eu esteja impressionado com isso, não é todo dia que você vê três pontos de interrogação no espaço de quatro caracteres).
Neil

Infelizmente, esta resposta parece falhar 0.99.
Neil

Também falha para 0.099etc. Minha tentativa de correção: Experimente online!
Neil

Também falha para 99.99, 100.001...
Neil

Ainda errado 0.099, desculpe. Pelo lado positivo, acho que você pode remover o +depois do ;na terceira linha.
Neil

2

PHP , 45 bytes

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

Experimente online!

O mesmo método da minha resposta python 2.

Também parece manipular corretamente 0.35, o que o coloca também acima da resposta JS: D


Curiosamente, acho que sua eliminado resposta Python 3 pode trabalhar em Python 2.
Anders Kaseorg

Testado, e faz! Editado e restaurou a resposta python agora
Skidsdev

2

T-SQL, 27 bytes

SELECT FORMAT(i,'G1')FROM t

Usando o mesmo código de formatação .Net da resposta C # de Carlos Alejo . A entrada é da coluna flutuante i na tabela t existente , de acordo com nossos padrões de IO

Casos de teste:

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

(É muito útil que eu possa pré-carregar a tabela de entrada com todos esses valores e executá-los de uma só vez.)


1

Python 2 , 62 bytes

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

Experimente online!

Não é usado para jogar python, mas isso funciona.

Falha 0.35devido a imprecisões de ponto flutuante.

Agradecemos a Anders Kaseorg por apontar que isso funciona corretamente no Python 2


A saída para 0.25é suposto ser 0.3.
Anders Kaseorg

@AndersKaseorg Não sei por que, mas só posso supor que seja devido às mesmas imprecisões de ponto flutuante da resposta do Javascript.
Skidsdev

Hmm, espera 25 tem o mesmo problema ... estranho.
Skidsdev

Para quem se perguntando, do Python 2 roundrodadas longe de zero, enquanto Python 3 rodadas até mesmo, por isso é que isso funciona em Py2 mas não 3.
flornquake

você pode jogar alguns bytes usando em log(x,10)vez de log10(abs(x)).
Alix Eisenhardt


1

Excel, 14 bytes

=ROUNDUP(A1,1)

Bem vindo ao site! Esta é uma boa primeira resposta. Você tem algum link para algum lugar que possa ser testado, de preferência online, para que outros usuários não precisem fazer o download do Excel?
caird coinheringaahing 5/09/19

Infelizmente, acho que não há sites gratuitos da Microsoft devido ao licenciamento, desculpe. Eu já vi outras respostas do Excel no Code Golf, mas não tenho certeza de como elas são validadas, pois sou novo!
Rew

Isso não funciona na maioria dos casos de teste. Está arredondando para a posição "décimos". Ele precisa arredondar (não subir) para qualquer que seja a posição mais significativa.
Hand-E-Food



0

Quarto (gforth) , 24 bytes

: f 1 set-precision f. ;

Experimente online!

A entrada é esperada na pilha de ponto flutuante. A saída é para stdout

Não gosto de fazer alterações na precisão global (para esta instância) das funções de saída de ponto flutuante, mas economiza muitos bytes para não precisar restaurar o valor anterior no final. Não produz em notação científica ou de engenharia, independentemente da entrada.

Nota: Por alguma razão, o intérprete tio é convertido 0.25em 0.2, enquanto minha instalação local é convertida 0.25em 0.3. Não sei ao certo por que isso ocorre, mas como obtenho o resultado correto localmente, estou deixando minha resposta 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.