Я полностью согласен с jherran, что вы не округляя номер, вы обрезаете его. Я бы сказал, что масштаб, вероятно, просто не ведет себя так, как вы этого хотите, возможно, таким образом, чтобы никто не хотел, чтобы он себя вел.
> x="5+50*3/20 + (19*2)/7"
> echo "$x" | bc -l
17.92857142857142857142
> echo "scale = 3; $x" | bc -l
17.928
Кроме того, because of the behaviour of scale, вы округления каждого умножения/деления отдельно от сложений.Позвольте мне доказать свою точку зрения несколькими примерами:
> echo "scale=0; 5/2" | bc -l
2
> echo "scale=0; 5/2 + 7/2" | bc -l
5
> echo "5/2 + 7/2" | bc -l
6.00000000000000000000
Однако масштаб без какой-либо операции также не работает. Существует уродливое обходное:
> echo "scale=0; 5.5" | bc -l
5.5
> echo "scale=0; 5.5/1" | bc -l
5
Так что буксировка происходит из этого.
Если вы хотите использовать шкалу bc, сделайте это только для окончательного результата, который уже вычислен, и даже тогда, остерегайтесь.
Помните, что округление - это то же самое, что и усечение числа + половина желаемой точности.
Давайте возьмем пример округления до ближайшего целого числа, если добавить .5 на номер, который должен быть округляется до ее целая часть будет принимать следующий целочисленное значение и усечение даст желаемого результата. Если это число должно быть округлено, то добавление .5 не изменит его целочисленное значение, и усечение даст тот же результат, что и при добавлении ничего.
Таким образом, мое решение следующим образом:
> y=$(echo "$x" | bc -l)
> echo "scale=3; ($y+0.0005)/1" | bc -l # scale doesn't apply to the +, so we get the expected result
17.929
Опять же, обратите внимание, что следующее не работает (как описано выше), тем самым нарушая его в две операции действительно необходимо:
> echo "scale=3; ($x+0.0005)/1" | bc -l
17.928
Ваш вопрос довольно неоднозначен. Что вы называете «образцом вывода»? Что вы называете «мой вывод»? Что вы называете «машина хочет, чтобы это было»? Собственно, каков результат, который вы хотите, чтобы ваш скрипт генерировал: усеченный или округленный? –
образец ввода - это вход, который машина генерирует, чтобы проверить, прав ли мой скрипт или нет, для которого он ожидает, что выход будет выходным, который является образцом вывода. и мой вывод - это результат, который генерирует мой сценарий, что мне нужно - это мой вывод, похожий на выходной образец @YvesDaoust – krrish
Возможно, я не уверен, что может быть неправильно сказать, что вы не сделали объяснение менее неясным. Усечен или округлен? –