Круглый как ноль


12

Цель

Учитывая введенное число, округлите его до ближайшего числа с одной значащей цифрой.

Требования

вход

  • Число с плавающей запятой.
  • Предположим, что введенное число приводит к выводу в пределах ограничений типа данных (т.е. игнорирует ошибки переполнения.)
  • 0 неверный ввод.
  • Числа, которые не могут быть точно представлены в типе данных с плавающей запятой (например "0.35", сохраняются как 0.3499999), не должны поддерживаться.

Выход

  • Ближайшее число, состоящее из одной ненулевой цифры и любого количества нулевых цифр.
  • Результат должен поддерживать отрицательные числа и дробные числа.
  • Когда вход находится точно между двумя возможными выходами, округлите от нуля.

презентация

Основное внимание уделяется расчету, а не презентации. Вывод может быть типом данных с плавающей запятой. Это может быть текст в полном объеме или в научной записи. Если вы обнаружите лазейку, в которой представление определенным образом уменьшает количество байт, слава вам!

Примеры

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

Тестовые случаи

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

счет

Код с наименьшим количеством байтов после одной недели выигрывает.


3
Я думаю, что «одна значимая цифра» - это фраза, которую вы ищете.
Стив Беннетт

2
Правило округления для 0 довольно странное.
xnor

2
@xnor, ты прав. 0 ближе к 0,0001, чем 1. Я думаю, что 0 просто должен быть недействительным.
Hand-E-Food

1
Да, и это не соответствует постановке цели.
Стив Беннетт

Ответы:


6

MATL , 3 байта

1&V

Попробуйте онлайн! Или проверьте все тестовые случаи .

0.25Сбой теста для компилятора, работающего в Octave на TIO, но работает в Matlab на Windows:

введите описание изображения здесь

Различное поведение вызвано sprintfфункцией Octave / Matlab, использующей либо «округление банкира», либо «.5 от нуля», в зависимости от платформы. Более подробную информацию и тесты можно найти здесь .


Для 6 байтов ,

1t3$Yo

работает как на Octave, так и на Matlab. Проверьте все контрольные примеры .


1
«Банковское округление» - это то, что заставило меня удалить мой ответ Желе. > _ <
Эрик Outgolfer

@EriktheOutgolfer Да, я понял, что это тоже причина. Мне повезло, что Matlab этого не делает :-D
Луис Мендо


9

Javascript, 19 байт

x=>x.toPrecision(1)

Это не соответствует спецификации 0или 25.
Андерс Касеорг

Интересный. Спецификация для 0не имеет смысла для меня. Но 0.35дело в том ... похоже, что Javascript пытается избежать смещения при округлении, но спецификация хочет смещения.
Стив Беннетт

Эй, ты изменил свой комментарий - ты написал 0.35не 25раньше. Я думаю, что он удовлетворяет спецификации для 25 - он возвращает «3e + 1», что мне кажется правильным.
Стив Беннетт

Извините, я изменил его, 0.35потому что 0.35не имеет точного представления с плавающей точкой. Поведение должно зависеть от браузера; Я получаю 252e+1в Firefox.
Андерс Касеорг

Да, я получаю эти два разных результата в Chrome против Firefox. Вау.
Стив Беннетт

4

Сетчатка , 63 62 байта

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

Попробуйте онлайн!


Очевидно, вам не нужно беспокоиться о конечных нулях, чтобы вы могли полностью удалить последнюю стадию (хотя я впечатлен этим, не каждый день вы видите три знака вопроса в интервале из четырех символов).
Нил

К сожалению, этот ответ, кажется, не для 0.99.
Нил

Также не удается 0.099и т.д. Моя попытка исправить: попробуйте онлайн!
Нил

Также не выполняется для 99.99, 100.001...
Neil

Все еще неправильно 0.099, извините. С другой стороны, я думаю, что вы можете удалить +после ;на третьей строке.
Нил

2

PHP , 45 байт

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

Попробуйте онлайн!

Тот же метод, что и в моем Python 2 ответа.

Также, кажется, правильно обрабатывает 0.35, что ставит его привязку выше ответа JS: D


Интересно, я думаю, что ваш удаленный ответ по Python 3 может работать в Python 2.
Андерс Касорг

Проверено, и это делает! Отредактировал и восстановил ответ Python сейчас
Skidsdev

2

T-SQL, 27 байт

SELECT FORMAT(i,'G1')FROM t

Используя тот же код форматирования .Net, что и в ответе C # Карлоса Алехо . Входные данные из плавающего столбца i в существующей таблице t , в соответствии с нашими стандартами ввода-вывода

Тестовые случаи:

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

(Довольно удобно, что я могу предварительно загрузить таблицу ввода со всеми этими значениями и запустить их сразу.)


1

Python 2 , 62 байта

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

Попробуйте онлайн!

Не используется для игры в гольф на питоне, но это работает.

Сбой 0.35из-за неточностей с плавающей запятой.

Спасибо Anders Kaseorg за указание, что это работает правильно в Python 2


Выход для 0.25должен быть 0.3.
Андерс Касеорг

@AndersKaseorg Я не уверен почему, но я могу только предположить, что это из-за тех же неточностей с плавающей точкой, что и ответ Javascript.
Скидсдев

Хм, подожди, 25 имеет ту же проблему ... странно.
Скидсдев

Для всех, кто интересуется, Python 2 roundокругляется от нуля, а Python 3 округляется до четного, поэтому это работает в Py2, но не в 3.
flornquake

Вы можете использовать несколько байт log(x,10)вместо log10(abs(x)).
Аликс


1

Excel, 14 байт

=ROUNDUP(A1,1)

Добро пожаловать на сайт! Это хороший первый ответ, есть ли у вас какие-нибудь ссылки, где это можно проверить, желательно онлайн, чтобы другим пользователям не приходилось загружать Excel?
Caird Coneheringaahing

К сожалению, я не думаю, что есть какие-либо бесплатные сайты Microsoft из-за лицензирования, извините. Я видел другие ответы Excel на Code Golf, но я не уверен, как они проверены, так как я новичок!
REW

Это не работает для большинства тестовых случаев. Это округление до позиции «десятых». Он должен округляться (не вверх) к какой-либо наиболее значимой позиции.
Hand-E-Food



0

Forth (gforth) , 24 байта

: f 1 set-precision f. ;

Попробуйте онлайн!

Ожидается ввод в стек с плавающей запятой. Выход на стандартный вывод

Мне не нравится вносить изменения в глобальную (для этого примера) точность выходных функций с плавающей запятой, но это экономит много байтов, чтобы не возвращать предыдущее значение в конце. Не выводит в инженерной или научной нотации, независимо от ввода.

Примечание. По какой-то причине интерпретатор tio преобразуется 0.25в 0.2, а моя локальная установка преобразуется 0.25в 0.3. Я не совсем уверен, почему это так, но так как я получаю правильный результат локально, я оставляю свой ответ как есть

: 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.