Удовлетворительное округление
Вы знаете, когда вы находитесь в классе науки, и попросили округлить до 2 сиг фиг, но ваш ответ 5.2501...
? Вы должны округлить до 5.3
, но это так неудовлетворительно! При округлении до 5.3
вы получаете целые 0,05, что является большим значением по сравнению с 0,1 (значение места, к которому вы округляете)! Так что помогите мне с удовлетворением.
Чтобы выполнить округление удовлетворительным образом, необходимо выполнить округление по первой найденной цифре, которая дает относительно небольшую ошибку - менее половины максимально возможной ошибки при округлении. По сути, вам нужно округлять каждый раз, когда вы сталкиваетесь с 0, 1, 8 или 9. Если этого никогда не происходит, вернуть входные данные как есть. Не округляйте ведущие нули или единицы - это просто не приносит удовлетворения.
вход
Строка или значение с плавающей запятой, которое представляет неотрицательное десятичное число.
Выход
Одно и то же десятичное число округляется удовлетворительно в формате строки или числа с плавающей запятой.
Примеры
Input -> Output
0 -> 0
0.5 -> 0.5
0.19 -> 0
0.8 -> 1
5.64511 -> 5.645
18.913 -> 20
88.913 -> 100
36.38299 -> 36.4
621 -> 620
803.22 -> 1000
547.4726 -> 547.4726
Это испытание для игры в гольф , поэтому выигрывает самый короткий код!
источник
036.40000
считаются допустимыми, считаются?.0
часть будет дана для целых чисел? Кроме того,0
не является положительным.19
раундов,20
но0.19
раундов0
? Почему?Ответы:
JavaScript (ES6),
100 99 9878 байтПринимает ввод в виде строки. Возвращает поплавок.
Попробуйте онлайн!
Как?
Сначала мы добавляем начальный0 к входной строке, чтобы у нас была гарантированная цифра перед возможным начальным 8 или 9 должна , которая должна сразу же вызвать округление.
ФлагJ устанавливается в 1 пока мы ищем цифру, по которой мы можем выполнить удовлетворительное округление, и затем устанавливается в 0 .
Поскольку в строку, по которой мы идем, был добавлен начальный0 но s был оставлен без изменений, d содержит текущий символ, а с [ я ] указывает на следующий символ.
Мы используем следующий код для загрузки следующей цифры вN , пропуская возможный десятичный разделитель:
Хотя строки в JavaScript являются неизменяемыми, выражениес [ я ] + 1 если оно содержит числовое значение, даже если с [ я ] фактически не увеличивается. Таким образом, выражение ел ы е (принуждаемого к 0 ) для всех цифр (включая 0 ) , а т т у й (принуждают к 1 ) для десятичного разделителя
++s[i]
вернет!++s[i]
оценивается в"."
.d + --j
d + j--
источник
Ruby ,
7977696765 байтПопробуйте онлайн!
объяснение
->n
Принять ввод как строкуz=n+".0"
Создайте временную строку,z
которая гарантированно содержит точку и соответствующую цифру.i=z=~/\./
Определите положение десятичной точки вz
и назначьтеi
.z[i]=''
Опустите точку, чтобы она не мешала дальше.z=~/(?!^)[01]|8|9/
Определите положение не запускается0-1
или любой8-9
, в зависимости от того, что наступит раньше.(...)-i
Эта разница будет числом десятичных разрядов, которое будет сохраняться, отрицательным, если мы будем округлять левую точку.n.to_f.round ...
Конвертировать, чтобы плавать и делать округления.источник
Желе , 34 байта
Попробуйте онлайн!
-1 спасибо Джонатану Аллану .
источник
ŒV
? Я думаю, чтоV
будет работать тоже._>¥0ɓVær
как у меня (я пропустил использование диадической быстрой, так что спасибо тоже!)Желе ,
3029 байт-1 спасибо Эрику Аутгольферу (использование диадического слова быстро
¥
из его ответа)Монадическая ссылка, принимающая список символов, который приводит к плавающей запятой.
Попробуйте онлайн! Или увидеть набор тестов .
Как
Прежде всего обратите внимание, что входная строка состоит исключительно из символов,
0123456789.
имеющих порядковые номера[48,49,50,51,52,53,54,55,56,57,46]
, которые имеют остатки при делении на восемь[0,1,2,3,4,5,6,7,0,1,6]
. Только символы , которые находятся между-1
и1
включительно0
,1
,8
и9
.Кроме того, если мы вычтем восемь из ординалов (
[40,41,42,43,44,45,46,47,48,49,38]
), то же самое (довольно очевидно) выполнено. Если мы делим их пополам ([20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,19]
), то единственными символами, у которых есть остатки при делении на восемь, между ними-1
и1
включительно, являются8
и9
.источник
Сетчатка 0.8.2 , 75 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Ручка ведущий ведущий
8
или9
.Если есть не ведущий
0
или1
, то обнулите его и оставшуюся часть строки. Кроме того, если есть8
или9
, оставьте его, но обнулите оставшуюся часть строки. (Но оставьте десятичную точку без изменений в любом случае.)Если в этой точке все еще есть
8
или или9
, то обнулите его и увеличьте предыдущую цифру (возможно, до десятичной точки).Удалите конечные нули, если они идут после десятичной точки, но удаляйте только десятичную точку, если между ними нет других цифр.
источник
C (gcc) ,
111102 байтаПопробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 280 байт
Попробуйте онлайн!
Это может быть короче, если я использую двойные вместо десятичных, но я использовал десятичные для сохранения точности, иначе число, такое как 547.4726 будет 547.472595214844.
C # (интерактивный компилятор Visual C #) , 268 байт
Попробуйте онлайн! (Менее точная версия)
источник