Я все еще ищу чистый bc ответ на то, как объединить только одно значение внутри функции, но вот чистый ответ bash:
#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
embiggen() {
local int precision fraction=""
if [ "$1" != "${1#*.}" ]; then # there is a decimal point
fraction="${1#*.}" # just the digits after the dot
fi
int="${1%.*}" # the float as a truncated integer
precision="${#fraction}" # the number of fractional digits
echo $(( 10**10 * $int$fraction / 10**$precision ))
}
# round down if negative
if [ "$float" != "${float#-}" ]
then round="-5000000000"
else round="5000000000"
fi
# calculate rounded answer (sans decimal point)
answer=$(( ( `embiggen $float` * 100 + $round ) / `embiggen 1.18` ))
int=${answer%??} # the answer as a truncated integer
echo $int.${answer#$int} # reassemble with correct precision
read -p "Press any key to continue..."
В принципе, это тщательно извлекает десятичные числа, умножает все на 100 миллиардов (10¹⁰, 10**10 в bash), настраивается для точности и округления, выполняет фактическое деление, делит обратно на соответствующую величину и затем вставляет десятичное число.
[d2 ] Шаг за шагом:Функция embiggen() присваивает усеченную целочисленную форму своего аргумента $int и сохраняет числа после точки в $fraction. Число дробных цифр отмечено в $precision. Математика умножает 10¹⁰ на конкатенацию $int и $fraction, а затем корректирует это, чтобы соответствовать точности (например, embiggen 48.86 становится 10¹⁰ × 4886/100 и возвращает 488600000000, что составляет 488 600 000 000).
[d4 ] Мы хотим получить окончательную точность сотых, поэтому умножим первое число на 100, добавим 5 для округления, а затем разделим второе число. Это присвоение $answer оставляет нас в сто раз окончательный ответ.Теперь нам нужно добавить десятичную точку. Мы присваиваем новое значение $int для $answer, исключая его последние две цифры, затем echo с точкой и $answer, за исключением значения $int, которое уже было выполнено. (Не обращайте внимания на ошибку подсветки синтаксиса, которая делает это похожим на комментарий)
(Башизм: возведение в степень не является POSIX, поэтому это базис. Чистое решение POSIX требует, чтобы циклы добавляли нули, а не использовали полномочия из десяти.Кроме того, «embiggen» - это отличное кромовое слово.)
Одна из основных причин, по которым я использую zsh, как свою оболочку, заключается в том, что она поддерживает математику с плавающей запятой. Решение этого вопроса довольно прямолинейно в zsh:
printf %.2f $((float/1.18))
(я бы хотел, чтобы кто-то добавил комментарий к этому ответу с трюком, чтобы включить арифметику с плавающей запятой в bash, но я уверен, что такой функции еще не существует.)
Стоит отметить, что, помимо настроек ядра, Ubuntu Desktop и Server по сути являются одним и тем же дистрибутивом, только с различным выбором пакета по умолчанию. Они используют одни и те же пакеты и репозитории. Если вы запустите apt-get install ubuntu-desktop, вы получите функциональный эквивалент Desktop Edition.
Это также означает, что любой пакет, предназначенный для Ubuntu Server, будет работать так же радостно при установке на вашем компьютере.
Если вы устанавливаете с использованием компакт-диска сервера или компакт-диска с рабочим столом, вы получаете тот же Ubuntu. Разница заключается в том, какой выбор пакетов он устанавливает по умолчанию - то есть - какой выбор программного обеспечения вы заканчиваете в конце процесса установки.
Можно перейти от настольной системы к серверу системы и наоборот на уже установленной копии Ubuntu. Ubuntu даже делает это относительно легко с помощью утилиты tasksel или с метапакетами, такими как ubuntu-desktop и ubuntu-server (доступный через стандартный менеджер пакетов apt, по крайней мере, с 16.04). Вы можете даже смешивать и сопоставлять - устанавливать среду рабочего стола на серверном или серверном программном обеспечении, таком как ssh_server или apache2, на основном настольном компьютере.
Но, скорее всего, вы, вероятно, уже знаете на момент установки, хотите ли вы настольной системы в комплекте с настольной средой или серверной системой. Таким образом, наличие разных установочных компакт-дисков для сервера и рабочего стола - просто фактор удобства, который делает выбор программного обеспечения немного проще.
Установщики также ведут себя по-разному, в том смысле, что только «настольная» версия устанавливается из графического Живой компакт-диск. Другие версии устанавливаются с помощью установщика на основе меню, подобного установщику Debian.