Bash Math Oddity (Подразделение с плавающей точкой)
Так что у меня возникли некоторые проблемы с математикой bash / bc здесь..
Я пытаюсь напечатать размер файла резервной копии после того, как переместил ее на свой gdrive через rclone для резервного копирования. Таким образом, я получаю размер файла с помощью инструкции rclone ls с awk print $ 1, которая прекрасно работает.
В моем конкретном примере я получаю значение 1993211 (байт).
Таким образом, в моем коде печати я пытаюсь разделить это на 1048576, чтобы получить его в МБ. Который должен дать мне 1,9 мб.
Тем не мение, $ expr 1993211 / 1048576 | bc -l
печать 1
Я пробовал различные другие варианты математики, перечисленные здесь (в том числе через Python / узел), и я всегда получаю 1 или 1,0. Как это возможно?
Расчет должен быть 1993211 / 1048576 = 1.90087413788
Есть идеи, что здесь происходит?
2 ответа
Это потому, что это целочисленное деление. Получите деление с плавающей запятой, которое вы можете запустить:
bc -l <<< '1993211 / 1048576'
который возвращает: 1.90087413787841796875
или вы можете установить количество десятичных знаков, используя шкалу:
bc -l <<< 'scale=5; 1993211 / 1048576'
который возвращает: 1.90087
В команде expr 1993211 / 1048576 | bc -l
, expr
делит 1993211 на 1048576, используя целочисленное деление (потому что это то, что expr
знает, как это сделать), получает "1" в результате и печатает его. bc -l
получает это "1" в качестве входных данных, и поскольку там не указана операция (expr
уже сделал это), он просто печатает его.
Вы хотите передать выражение "1993211 / 1048576" непосредственно в качестве ввода bc -l
:
$ echo "1993211 / 1048576" | bc -l
1.90087413787841796875