В этом ответе на первый связанный вопрос есть почти отбрасывающая строка в конце:
См. также
%g
для округления до заданного числа значащих цифр.
Поэтому вы можете просто написать
printf "%.2g" "$n"
(но см. раздел ниже о десятичном разделителе и локали, и обратите внимание, что не-Bash printf
не обязательно поддерживает %f
и %g
).
Примеры:
$ printf "%.2g\n" 76543 0.0076543
7.7e+04
0.0077
Конечно, теперь у вас есть представление мантисса-экспонента, а не чистая десятичная дробь, поэтому вы захотите преобразовать обратно:
$ printf "%0.f\n" 7.7e+06
7700000
$ printf "%0.7f\n" 7.7e-06
0.0000077
Собрав все это вместе и обернув в функцию:
# Function round(precision, number)
round() {
n=$(printf "%.${1}g" "$2")
if [ "$n" != "${n#*e}" ]
then
f="${n##*e-}"
test "$n" = "$f" && f= || f=$(( ${f#0}+$1-1 ))
printf "%0.${f}f" "$n"
else
printf "%s" "$n"
fi
}
(Примечание - эта функция написана в переносимой (POSIX) оболочке, но предполагает, что printf
обрабатывает преобразования с плавающей точкой. В Bash есть встроенный printf
, который это делает, так что здесь все в порядке, и реализация GNU тоже работает, так что большинство GNU/Linux систем могут смело использовать Dash).
radix=$(printf %.1f 0)
for i in $(seq 12 | sed -e 's/.*/dc -e "12k 1.234 10 & 6 -^*p"/e' -e "y/_._/$radix/")
do
echo $i "->" $(round 2 $i)
done
.000012340000 -> 0.000012
.000123400000 -> 0.00012
.001234000000 -> 0.0012
.012340000000 -> 0.012
.123400000000 -> 0.12
1.234 -> 1.2
12.340 -> 12
123.400 -> 120
1234.000 -> 1200
12340.000 -> 12000
123400.000 -> 120000
1234000.000 -> 1200000
Вся работа выше предполагает, что символ радикса (также известный как десятичный разделитель) - это .
, как в большинстве английских локалей. В других локалях используются ,
, и некоторые оболочки имеют встроенный printf
, который учитывает локаль. В этих оболочках может потребоваться установить LC_NUMERIC=C
, чтобы заставить использовать .
в качестве символа радикса, или написать /usr/bin/printf
, чтобы предотвратить использование встроенной версии. Последнее осложняется тем, что (по крайней мере, некоторые версии), похоже, всегда разбирают аргументы, используя .
, но печатает, используя текущие настройки локали.
Самый простой способ установить новое ядро - использовать резервные порты Jessie .
Сначала вам нужно добавить резервные копии Jessie в свои репозитории, если их там еще нет:
echo deb http://http.debian.net/debian jessie-backports main > /etc/apt/sources.list.d/jessie-backports.list
(как root), тогда
apt-get update
apt-get -t jessie-backports install linux-image-amd64
установит текущее ядро по умолчанию backported (на данный момент 4.8 пишу).
Чтобы обеспечить соответствующую прошивку для Wi-Fi вашего ноутбука, вам необходимо добавить non-free
и установить firmware-iwlwifi
:
echo deb http://http.debian.net/debian jessie-backports main contrib non-free > /etc/apt/sources.list.d/jessie-backports.list
apt-get update
apt-get -t jessie-backports install firmware-iwlwifi
Чтобы решить проблемы с отображением, вы может удалить xserver-xorg-video-intel
(в настоящее время графическим процессорам Intel не нужен отдельный драйвер, они могут использовать поддержку настройки режима ядра), как предлагается GAD3R :
apt-get remove xserver-xorg-video-intel
(Вам может потребоваться установить xserver-xorg-video-dummy
для удовлетворения зависимостей других пакетов.)
Вам также следует установить микропрограмму Skylake, чтобы включить все функции графического процессора:
apt-get -t jessie-backports install firmware-misc-nonfree
Включение backports безопасно: новые пакеты не выбираются автоматически из backports, вам нужно явно выбрать их, используя -t jessie-backports
, как указано выше (но как только вы это сделаете, будут выбраны обновления для обновленных пакетов вверх по apt-get upgrade
).
Версия ядра 4.6 уже обеспечивала хорошую поддержку Skylake, и с тех пор она улучшилась. Если вы обновляете, как указано выше, запуск apt-get upgrade
автоматически обновит до более поздних версий ядра, как только они станут доступны в резервных портах.
Моя ОС - Debian Jessie с Mate рабочий стол
root@s32408:~# uname -a
Linux s32408 4.8.0-0.bpo.2-amd64 #1 SMP Debian 4.8.15-2~bpo8+2 (2017-01-17) x86_64 GNU/Linux
После обновления ядра до 4.8 с резервных портов для устранения проблемы с WIFI, Я столкнулся с ошибкой отображения при перезагрузке системы. Затем я удалил драйвер Intel, как указано выше, и он исправил ошибку.
Но при этом многие важные пакеты стали «больше не нужны».Я сначала не обратил внимания, а потом немного почистил:
apt-get autoremove
А после следующей перезагрузки я потерял графический рабочий стол и многие полезные приложения .
Затем я переустановил новую ОС и обнаружил, что установка обновленного драйвера Intel из резервных копий (вместо его удаления) также исправляет ошибку отображения, но не нарушает зависимости. Другими словами, я сделал:
apt-get -t jessie-backports install xserver-xorg-video-intel
вместо:
apt-get remove xserver-xorg-video-intel
Вы можете в любом случае удалить драйвер и изменить зависимости, чтобы преодолеть поломку, как это было предложено Стивеном Киттом в комментариях. Вам решать.
Обратите внимание, что рабочий стол XCFE также подвержен этой проблеме, а рабочий стол Gnome - нет.
Спасибо Лео Леопольду Герцу за подсказку о Гноме и Стивену Китту за его огромное терпение;)