2016-09-05 10 views
0
5+50*3/20 + (19*2)/7 = 17.9285714286 
        = 17.929 

Я хочу, чтобы точное значение было усечено до трех знаков после запятой, то есть 17.929, выполнив следующую операцию bash.Почему ошибка округления в bash?

echo " scale = 3; 5+50*3/20 + (19*2)/7 " | bc 

Но это дает мне значение 17.928.

$ echo " scale = 3; 5+50*3/20 + (10*9)/7 " | bc 
17.928 

Что я могу сделать?

N.B .: Это Hackerrank challenge. Даже это не дает правильного вывода в их консоли.

ответ

3

При использовании scale=3 в bc, вы не только с указанием количества знаков после запятой в выходных данных, вы ограничиваете количество знаков после запятой, что bc использует, чтобы сделать его расчеты.

Чтобы получить правильный вывод, используйте printf с bc:

$ printf '%.3f\n' "$(bc -l <<<'5+50*3/20 + (19*2)/7')" 
17.929 

Если выражение внутри переменной $var, заменить строку в одинарные кавычки с "$var".

+0

Спасибо! Мне это ясно сейчас :) – jbsu32

4

bc является потолочным десятичным значением, а не округлением. Вы можете использовать AWK:

awk 'BEGIN{printf "%.3f\n", 5+50*3/20 + (19*2)/7}' 
17.929 
+0

Большое спасибо! Работает! Но, как обрабатывать переменную ?? Я имею в виду, 'awk 'BEGIN {printf"% .3f \ n ", $ a}'' дает вывод '0.000'. – jbsu32

+0

Вы можете использовать: 's = '5 + 50 * 3/20 + (19 * 2)/7'; awk 'BEGIN {printf "% .3f \ n",' "$ s" '}' 'в этом случае. – anubhava