2014-10-02 4 views
5

Итак, это проблема хакерранка (https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations). В принципе, ввод - это арифметическое выражение, и я должен распечатать отформатированный ответ (3 десятичных знака). Я попробовал это сначалаРазница между отношением округления printf% .3f и bc

read exp 
echo "scale = 3; $exp" | bc -l 

Прошло несколько испытаний, но не первое.

5+50*3/20 + (19*2)/7 Ответ 17.929, но мой код распечатывает 17.928. Я попробовал этот код вместо

read exp 
printf "%.3f\n" `echo $exp | bc -l` 

Примечания: эхо часть должна быть в обратных кавычках, но я ставлю «», чтобы не путать с блочными кавычками. Все тесты прошли. Так в чем разница?

+0

Backticks подходят только для форматирования кода меньше, чем для строк. Для многострочных сегментов используйте отступы для форматирования кода (это то, что редактор javascript сделает для вас, если вы нажмете кнопку кода). –

+0

... поочередно используйте '$ (...)' вместо '\' ... \ '' так или иначе - это современный синтаксис POSIX и менее запутанный для гнезда. –

+0

.... также - 'echo '$ exp" | bc -l', а не 'echo $ exp | bc -l'; если ваше выражение содержало пробелы вокруг '*', у вас было бы очень удивительное поведение без кавычек (и даже без пробелов у вас было бы удивительное поведение, если бы в вашей оболочке была опция «nullglob»). –

ответ

5

Причина, по которой эти два отличаются друг от друга, заключается в том, что bc всегда отсекает числа, а не округляет их. I. e. echo "scale = 3 ; 8/9" | bc производит 0.888 вместо правильно округленного 0.889.

Ваш тестовый пример оценивается в 17.928571429, который округляется до 17.929 с использованием вашего подхода printf, но отключается до 17.928 с использованием метода bc.

2

Я думаю, что проблема scale = 3; часть. Например, если вы используете

 printf "%.3f\n" ` echo "scale = 3 ; $exp " | bc -l` 

Вы получите 17.928 снова. Таким образом, ответ заключается в том, что вам необходимо установить масштаб как минимум на 4, а затем напечатать его тремя знаками.

1

Проблема заключается в округления и/или значащие цифры возвращенные bc. Когда вы используете echo с scale=3, вы полагаетесь на bc, чтобы вернуть только 3 цифры. Когда вы укажете printf только для вывода 3 десятичных разряда (с использованием формата %.3f), вы полагаетесь на printf, чтобы определить, какие цифры. По существу, разница заключается в округлении, сделанном bc, используя scale=3, и это сделано printf с двойным преобразованием %.3f.

+0

Надеюсь, я не буду самонадеянным или жестоким с редактированием. –

+0

Nope - отлично выглядит. Возьмите всю необходимую редакционную свободу :) –

0
v=$(sed 's/[[:blank:]]//g') 
(echo "scale=4"; echo $v) | bc | xargs printf '%.3f' 

выше считывает целое число от стандартного ввода, удаляет пустые строки, трубы его к Ьсу, чтобы выполнить расчет с точностью 4 знака, а затем форматирует его с правильным округлением до 3 цифр с помощью Printf. Мое решение вышеупомянутой проблемы HackerRank.

+2

Пожалуйста, не отправляйте только код-ответы.Объясните, что означает код – arco444

 Смежные вопросы

  • Нет связанных вопросов^_^