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
Другие вопросы по тегам