как в баше умножать числа с плавающей запятой? *WALL*
умножение в bash с плавающей запятой.
нашел. может надо кому?
gu@moshell:~$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment
1455.00
gu@moshell:~$
другой вопрос.
как запретить показ запятой и то что после нее идет?
в моей задаче переменные с одним знаком после запятой будут умножаться на 100.
ессессно запятая не нужна в результате.
не "костылять" же результат sed'ом
$ python -c "print('%.f' % (100 * 14.55))"
не "костылять" же результат sed'ом
Не уверен, но, по-моему, в случае с bash и float не "костылять" не выйдет.
gu@moshell:~$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment
1455.00
*SCRATCH*
$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment | awk '{ print int($payment) }'костыль, конечно.
нашел. может надо кому?
угу. Калькулятор называется bc
как запретить показ запятой и то что после нее идет?
вы же написали(нагуглили) scale=2.
1/3
.33333333333333333333
scale=0
1/3
0
можно и bash'ем
$ echo $X
33.33333333333333333333
$ echo ${X%.*}
33
не "костылять" же результат sed'ом
костыль, конечно.
не sed'ом так awk =)
если результат сразу выводится в каком-то приглядном виде, то можно это printf'ом делать...
ЗЫ: осторожней с bc... он не округляет числа, а отбрасывает дробную часть... ИМХО это тот случай, когда лучше прибегнуть к питону, если есть возможность...
ну округляйте?осторожней с bc... он не округляет числа, а отбрасывает дробную часть...
ИМХО вы бредите: округлять можно тысячью способов, усекать до целого -- единственным. Да и вообще, ЯП тут не причём. Да и вообще, ЯП с любой точностью лучше по любому.ИМХО это тот случай, когда лучше прибегнуть к питону, если есть возможность...
И да, если вы наивно думаете, что это вам позволит сравнивать FP на равенство, то вы ОЧЕНЬ заблуждаетесь.
ИМХО вы бредите: округлять можно тысячью способов, усекать до целого -- единственным. Да и вообще, ЯП тут не причём.
ничего не брежу... ты сам же небось ни разу bc в скрипте не пользовался?
а я говорю как есть... с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
2ТС, в будущем лучше подучить перл или питон и если потребуется FP арифметика, то скриптовать целиком на них... bash в этом плане лажает...
округлять можно тысячью способов
я знаю только 4... просвети меня...
Да и вообще, ЯП с любой точностью лучше по любому.
bc — арифметика с заданной точностью, а не с любой...
И да, если вы наивно думаете, что это вам позволит сравнивать FP на равенство, то вы ОЧЕНЬ заблуждаетесь.
а это тут вообще при чём?
пользовался.ничего не брежу... ты сам же небось ни разу bc в скрипте не пользовался?
для меня результат этого быдлокода будет вполне ожидаем. В том смысле, что этот быдлокод выдаст какую-то ненужную ерунду, которая прямо зависит от фазы луны.а я говорю как есть... с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат...
это только так кажется. И только в очень простых примерах, когда интерпретатор угадывает то, что угадывать не должен. Это не магия. Пример 1/9*100 не имеет никакого смысла, если в спеках декларируется равенство приоритетов операций умножения и деления, и кроме того вы считаете в целых числах.питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
А ваш питон врёт, ибо считает в дробных, хотя был прямой приказ считать в целых. Ну или вам просто повезло, и питону почему-то сначала захотелось умножить, а уж потом разделить, а не наоборот, как у вас записано.
2ТС, в будущем лучше подучить перл или питон и если потребуется FP арифметика, то скриптовать целиком на них... bash в этом плане лажает...
bash тут вообще не при чём, ибо там НЕТ дробных чисел. Ну то есть ВООБЩЕ.
я знаю только 4... просвети меня...
лень. Да в принципе и одного достаточно, того, что в школе учат. Этот вариант постоянно используется, и равносилен умножению на ноль битов, которые получаются после вычитания битов левее 1(2^0) из 1/2. А фокус в том, что когда ты такие округлённые числа вычитаешь (например сравниваешь с другим целым), ты эти биты ДЕЛИШЬ НА НОЛЬ.
Проблема в том, что твой питон этого НЕ ВИДИТ. В итоге лажается, и пишет какой-то бред. Который ты по наивности принимаешь за ответ.
bc — арифметика с заданной точностью, а не с любой...
ну очевидно же, что с любой заданной.
а это тут вообще при чём?
а это тут при том, что числа, которые получил путём округления, НЕЛЬЗЯ использовать как целые. В частности их нельзя сравнивать друг с другом, и с любыми другими целыми.
А вот теперь рассказывай: ЗАЧЕМ вообще тебе округлять?
А ваш питон врёт, ибо считает в дробных, хотя был прямой приказ считать в целых. Ну или вам просто повезло, и питону почему-то сначала захотелось умножить, а уж потом разделить, а не наоборот, как у вас записано.
$ python -c "print(1/9*100)"
0
$ python -c "print(1.0/9*100)"
11.1111111111
-=Serj=-, я чего-то не понял, в bc тоже 0 получается, в чём магия питона?
кстати:
$ echo "1/9*100" | bc -l
11.11111111111111111100
и в чём проблема?
-=Serj=-, я чего-то не понял, в bc тоже 0 получается, в чём магия питона?
Не понял вопроса... Я лишь указал, что питон считает в целых, если все операнды - целые.
кстати:
$ echo "1/9*100" | bc -l
11.11111111111111111100
и в чём проблема?
Видимо, в этом:
$ echo "scale=0; 1/9*100" | bc -l
0
Не понял вопроса... Я лишь указал, что питон считает в целых, если все операнды - целые.
дык а при чём тут "осторожность"?
я вот этого не понял vvv
с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
[quote="moshell"]нашел. может надо кому?
угу. Калькулятор называется bc
как запретить показ запятой и то что после нее идет?
вы же написали(нагуглили) scale=2.
1/3
.33333333333333333333
scale=0
1/3
0
можно и bash'ем
$ echo $X
33.33333333333333333333
$ echo ${X%.*}
33
[/quote]
а вот нифига
gu@moshell:~$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment
1455.00
gu@moshell:~$ payment=$(echo "scale=0; 100*14.55" | bc); echo $payment
1455.00
gu@moshell:~$
1455.00
ну юзайте bash, или какие-то другие строки.
$ echo $X
33.33333333333333333333
$ echo ${X%.*}
33
дык а при чём тут "осторожность"?
я вот этого не понял vvv
Fat-Zer пишет:с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
только то что написано: использование bc в скриптах без осмотрительности даёт большое количество ошибок...
В том смысле, что этот быдлокод выдаст какую-то ненужную ерунду, которая прямо зависит от фазы луны.
ИМХО ожидается, что он выдаст 11, т.е. просто отбросит дробную часть... и подставленным 1.0 делу не поможешь...
$ echo "1/9*100" | bc -l
11.11111111111111111100и в чём проблема?
как и везде, в том, что два последних разряда не правильные... и это надо самому округлять...
bash тут вообще не при чём, ибо там НЕТ дробных чисел. Ну то есть ВООБЩЕ.
дык, в этом и идея, что если FP нужны, то на bash'е лучше не писать...
лень. Да в принципе и одного достаточно, того, что в школе учат. Этот вариант постоянно используется, и равносилен умножению на ноль битов, которые получаются после вычитания битов левее 1(2^0) из 1/2. А фокус в том, что когда ты такие округлённые числа вычитаешь (например сравниваешь с другим целым), ты эти биты ДЕЛИШЬ НА НОЛЬ.Проблема в том, что твой питон этого НЕ ВИДИТ. В итоге лажается, и пишет какой-то бред. Который ты по наивности принимаешь за ответ.
ничего не понял...
а это тут при том, что числа, которые получил путём округления, НЕЛЬЗЯ использовать как целые. В частности их нельзя сравнивать друг с другом, и с любыми другими целыми.А вот теперь рассказывай: ЗАЧЕМ вообще тебе округлять?
при выводе дробные числа как-то принято округлять...
я так и не понял. где калькулятор для консоли?
в с++ помнится было такое что можно было подавлять лишние нули и "лишние" "цифры" - округление то есть.
как это в ком строке сделать?
пусть это будет какой то внешний установленный калькулятор консольный, мне свои скрипты все равно никуда не переносить
буду благодарен чрезмерно.
простая задача сводится на нет. тупо умножить "плавающую" цифру на не плавающую неужели это сложно в bash. (ответ - в bash ДА!)
ОПять вопрос - внешнюю утилиту какую посоветуете?