Круглі до n Sig Fig


20

Виклик

Давши число xі число n, округлете число xдо nзначущих цифр і виведіть результат.

Видатні постаті

Значущі цифри числа - це цифри, що мають значення, що сприяють його роздільній здатності. Сюди входять усі числа, крім провідних нулів.

Майте на увазі, що провідні нулі після десяткових знаків все ще є незначними цифрами.

Під час округлення цифри потрібно округлюватись від нуля, якщо наступна цифра більша або дорівнює п’яти.

Усі нулі після десяткових знаків зараховуються як значущі.

Вхідні дані

Перше число буде x, число, яке потрібно округлити. Другим числом буде nкількість значущих цифр, до яких слід округнути x.

xбуде число (ваш код повинен обробляти як цілі числа, так і плаваючі точки) від -1 000 000 000 до 1 000 000 000 включно. nбуде натуральним числом від 1 до 50 включно. nніколи не буде більшим за число цифр у x.

Вхід ніколи не буде 0або будь-якою формою 0, наприклад, 0.000або 000.

Приклади

Inputs: 2.6754, 2
Output: 2.7

Виведення значення 2.7000було б недійсним, оскільки кінцеві нулі після десяткових знаків зараховуються як значущі цифри.


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

Зауважте, що це не повинно мати десяткову точку.


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

Якщо ви хочете, ви можете 520.замість цього вивести, але ні 520.0.


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

Правила

Вбудовані функції та бібліотеки, які дозволяють округляти число до nзначних цифр, заборонені.

Перемога

Виграє найкоротший код у байтах.


4
Бо Inputs: 520.3, 3чи не 520.важлива десяткова крапка у відповіді ?
Грег Мартін

5
@GregMartin Я вважаю, що це так, оскільки це єдине, що змушує його мати 3 сиг-
інжири

3
@BetaDecay Ні, це не так. Для цього знадобиться десяткова крапка.
mbomb007

3
"200 вважається лише
однією

4
@DLosc Ось чому, якби це був результат, ви насправді 2.0 x 10^2записали б його , показуючи 2 сигфіги.
mbomb007

Відповіді:


3

Python 3, 83 байти

(подібно до відповіді PHP)

from math import *
def s(x,n):
 y=10**(ceil(log10(abs(x)))-n)
 return y*round(x/y)

Тестові приклади:

tests = [(2.6754,2), (0.00034551, 4), (50237.1238, 3),
        (2374905, 1), (543.0489, 4), (15, 1), (520.3, 3), (-53.87, 2)]

print ([s(x,n) for x,n in tests])

Вихід:

[2.7, 0.0003455, 50200, 2000000, 543.0, 20, 520, -54]

Крім трохи довшого, ще один підхід, який я вважав:

from math import *
def s(x,n):
 z=ceil(log10(abs(x)))
 return "%.*f"%(n-z,10**z*round(x/10**z,n))

... видає неправильний вихід для вводу (15, 1):

['2.7', '0.0003455', '50200', '2000000', '543.0', '10', '520', '-54']

... через неточність плаваючої точки у round()функції. Мені здається, ймовірно, що я міг би знайти тестові випадки, які б порушили метод "круглого до нуля десяткових знаків", навіть якщо я виглядав досить важко.

Таким чином, мені здається, що моє рішення, ймовірно, не на 100% правильне для всіх випадків і не було б, якщо б воно не було обчислене у десятковій кількості. Отже, це питання може впливати на рішення будь-якою мовою, яка використовує арифметику FP.


Збережіть кілька байтів, помістивши тіло sв ту саму лінію, а потім використовуйте крапки з комою. def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

Також ви можете прибрати простір, import *щоб зробити цеimport*
Cyoce

Ваша відповідь для мене не нормальна, оскільки правила кажуть: "Вбудовані функції та бібліотеки, які дозволяють округлити число до n значних цифр, заборонені". І ви використовуєте круглу функцію з n = 0
RosLuP

@RosLuP: Функція закріплюється round()на nдесяткові місця, а не на nзначні цифри, тому це було дозволено для цієї події в гольфі.
Саймон

5

PHP, 130 байт

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-ceil(log(abs($i),10))),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 133 байт працює зі значеннями <1 для значущих цифр

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-floor(log(abs($i),10))-1),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP, 56 байт працює, але пропускає зайві нулі

<?=round($i=$argv[1],$argv[2]-floor(log(abs($i),10))-1);

Хтось викрав або видалив круглу функцію в PHP! Щоб зробити виклик цікавішим. 127 байт

<?=ceil($x=($i=$argv[1])*10**(($r=$argv[2])-($l=floor(log(abs($i),10))+1)))-$x<=0.5?ceil($x)*10**($l-$r):floor($x)*10**($l-$r);

Це також пропускає непридатні Нулі. Це версія, в якій я не використовую натиснуту функцію "круглого" в PHP, лише для жарту. Він належить до 56-байтної версії, яку я вважаю за краще
Йорг Хюльсерманн,

Гаразд, якщо не використовувати бібліотечний раунд ....
RosLuP

3

Пакетна, 660 652 байт

@echo off
set m=%1.
set s=
if %m:~,1%==- set s=-&set m=%m:~1%
:m
if %m:~,1%==0 set m=%m:~1%&goto m
set d=%m:.=%
:d
if %d:~,1%==0 set d=%d:~1%&goto d
for /l %%i in (1,1,%2) do call set d=%%d%%0
call set r=%%d:~%2,1%%
call set d=%%d:~,%2%%
if %r% leq 4 goto r
set r=
:i
set/ai=1+%d:~-1%
set r=%i:~-1%%r%
set d=%d:~,-1%
if %i% leq 9 set d=%d%%r%&goto r
if not "%d%"=="" goto i
set d=1%r:~1%
set m=1%m%
set m=%m:1.0=.%
:r
if %m:~,2%==.0 set m=%m:.0=.%&set d=0%d%&goto r
set i=0
set p=.
:l
if %m:~,1%==. echo %s%%i%%p%%d%&exit/b
if %i%==0 set i=
if "%d%"=="" set d=0&set p=
set i=%i%%d:~,1%
set d=%d:~1%
set m=%m:~1%
goto l

Пояснення: Починається з суфіксації .параметра до випадку, якщо його вже немає, а потім обрізає знак (який зберігається) та будь-які провідні нулі. Отримана змінна mзберігається на потім, оскільки вона підкаже нам бажану величину результату. .Потім видаляються будь-які s, що може призвести до подальших нулів, тому вони також видаляються. nнулі вистачають на те, щоб забезпечити достатню кількість цифр для округлення, потім видобуто nго та перші nцифри. Якщо nцифра th не дорівнює 4 або менше, ми нудно додаємо 1до рядка. Якщо рядок переповнюється, ми збільшуємо величину за допомогою префікса а 1, але якщо вона спочатку була меншою, ніж 0.1ми робимо її, видаляючи 1щойно доданий, а також0після десяткової крапки. Якщо величина все ж менша, ніж 1тоді, ми копіюємо нулі після десяткової крапки до результату, однак якщо вона є 1або більше, то ми витягуємо цілу частину відповіді, додаючи додаткові нулі, якщо потрібно, щоб досягти десяткової точки (яка є видалено, як це показало б неправильну точність). Нарешті знак, ціла частина, десяткова крапка і десяткова частина об'єднуються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.