LinuxForum.Fans
Тема

умножение в bash с плавающей запятой.

Автор: moshell 32 сообщений 12495 просмотров
#341899

как в баше умножать числа с плавающей запятой? *WALL*

#341901

нашел. может надо кому?

gu@moshell:~$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment
1455.00
gu@moshell:~$

#341902

другой вопрос.
как запретить показ запятой и то что после нее идет?

в моей задаче переменные с одним знаком после запятой будут умножаться на 100.
ессессно запятая не нужна в результате.


не "костылять" же результат sed'ом

#341919
text

$ python -c "print('%.f' % (100 * 14.55))"
#341924
"moshell" написал:
не "костылять" же результат sed'ом

Не уверен, но, по-моему, в случае с bash и float не "костылять" не выйдет.

"moshell" написал:
gu@moshell:~$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment
1455.00

*SCRATCH*

text
$ payment=$(echo "scale=2; 100*14.55" | bc); echo $payment | awk '{ print int($payment) }'

костыль, конечно.

#341926
"moshell" написал:
нашел. может надо кому?

угу. Калькулятор называется bc

"moshell" написал:
как запретить показ запятой и то что после нее идет?

вы же написали(нагуглили) scale=2.

text
1/3
.33333333333333333333
scale=0
1/3
0

можно и bash'ем

text
$ echo $X
33.33333333333333333333
$ echo ${X%.*}
33
#342351
"moshell" написал:
не "костылять" же результат sed'ом
"xxblx" написал:
костыль, конечно.

не sed'ом так awk =)

если результат сразу выводится в каком-то приглядном виде, то можно это printf'ом делать...
ЗЫ: осторожней с bc... он не округляет числа, а отбрасывает дробную часть... ИМХО это тот случай, когда лучше прибегнуть к питону, если есть возможность...

#342364

"Fat-Zer" написал:
осторожней с bc... он не округляет числа, а отбрасывает дробную часть...
ну округляйте?

"Fat-Zer" написал:
ИМХО это тот случай, когда лучше прибегнуть к питону, если есть возможность...
ИМХО вы бредите: округлять можно тысячью способов, усекать до целого -- единственным. Да и вообще, ЯП тут не причём. Да и вообще, ЯП с любой точностью лучше по любому.

И да, если вы наивно думаете, что это вам позволит сравнивать FP на равенство, то вы ОЧЕНЬ заблуждаетесь.
#342526
"drBatty" написал:
ИМХО вы бредите: округлять можно тысячью способов, усекать до целого -- единственным. Да и вообще, ЯП тут не причём.

ничего не брежу... ты сам же небось ни разу bc в скрипте не пользовался?
а я говорю как есть... с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
2ТС, в будущем лучше подучить перл или питон и если потребуется FP арифметика, то скриптовать целиком на них... bash в этом плане лажает...

"drBatty" написал:
округлять можно тысячью способов

я знаю только 4... просвети меня...

"drBatty" написал:
Да и вообще, ЯП с любой точностью лучше по любому.

bc — арифметика с заданной точностью, а не с любой...

"drBatty" написал:
И да, если вы наивно думаете, что это вам позволит сравнивать FP на равенство, то вы ОЧЕНЬ заблуждаетесь.

а это тут вообще при чём?

#342541
"Fat-Zer" написал:
ничего не брежу... ты сам же небось ни разу bc в скрипте не пользовался?
пользовался.

"Fat-Zer" написал:
а я говорю как есть... с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат...
для меня результат этого быдлокода будет вполне ожидаем. В том смысле, что этот быдлокод выдаст какую-то ненужную ерунду, которая прямо зависит от фазы луны.

"Fat-Zer" написал:
питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
это только так кажется. И только в очень простых примерах, когда интерпретатор угадывает то, что угадывать не должен. Это не магия. Пример 1/9*100 не имеет никакого смысла, если в спеках декларируется равенство приоритетов операций умножения и деления, и кроме того вы считаете в целых числах.

А ваш питон врёт, ибо считает в дробных, хотя был прямой приказ считать в целых. Ну или вам просто повезло, и питону почему-то сначала захотелось умножить, а уж потом разделить, а не наоборот, как у вас записано.

"Fat-Zer" написал:
2ТС, в будущем лучше подучить перл или питон и если потребуется FP арифметика, то скриптовать целиком на них... bash в этом плане лажает...

bash тут вообще не при чём, ибо там НЕТ дробных чисел. Ну то есть ВООБЩЕ.

"Fat-Zer" написал:
я знаю только 4... просвети меня...

лень. Да в принципе и одного достаточно, того, что в школе учат. Этот вариант постоянно используется, и равносилен умножению на ноль битов, которые получаются после вычитания битов левее 1(2^0) из 1/2. А фокус в том, что когда ты такие округлённые числа вычитаешь (например сравниваешь с другим целым), ты эти биты ДЕЛИШЬ НА НОЛЬ.

Проблема в том, что твой питон этого НЕ ВИДИТ. В итоге лажается, и пишет какой-то бред. Который ты по наивности принимаешь за ответ.

"Fat-Zer" написал:
bc — арифметика с заданной точностью, а не с любой...

ну очевидно же, что с любой заданной.

"Fat-Zer" написал:
а это тут вообще при чём?

а это тут при том, что числа, которые получил путём округления, НЕЛЬЗЯ использовать как целые. В частности их нельзя сравнивать друг с другом, и с любыми другими целыми.

А вот теперь рассказывай: ЗАЧЕМ вообще тебе округлять?

#342617
"drBatty" написал:
А ваш питон врёт, ибо считает в дробных, хотя был прямой приказ считать в целых. Ну или вам просто повезло, и питону почему-то сначала захотелось умножить, а уж потом разделить, а не наоборот, как у вас записано.
text

$ python -c "print(1/9*100)"
0
$ python -c "print(1.0/9*100)"
11.1111111111
#342624

-=Serj=-, я чего-то не понял, в bc тоже 0 получается, в чём магия питона?

#342626

кстати:

text
$ echo "1/9*100" | bc -l
11.11111111111111111100

и в чём проблема?

#342627
"drBatty" написал:
-=Serj=-,  я чего-то не понял, в bc тоже 0 получается, в чём магия питона?

Не понял вопроса... Я лишь указал, что питон считает в целых, если все операнды - целые.

"drBatty" написал:
кстати:
$ echo "1/9*100" | bc -l
11.11111111111111111100
и в чём проблема?

Видимо, в этом:

text

$ echo "scale=0; 1/9*100" | bc -l
0
#342659
"-=Serj=-" написал:
Не понял вопроса... Я лишь указал, что питон считает в целых, если все операнды - целые.

дык а при чём тут "осторожность"?

я вот этого не понял vvv

"Fat-Zer" написал:
с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...
#342930
drBatty написал:
[quote="moshell"]нашел. может надо кому?

угу. Калькулятор называется bc

"moshell" написал:
как запретить показ запятой и то что после нее идет?

вы же написали(нагуглили) scale=2.

text
1/3
.33333333333333333333
scale=0
1/3
0

можно и bash'ем

text
$ 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:~$

#342976
"moshell" написал:
1455.00

ну юзайте bash, или какие-то другие строки.

text

$ echo $X 
33.33333333333333333333 
$ echo ${X%.*} 
33
#344642
"drBatty" написал:

дык а при чём тут "осторожность"?
я вот этого не понял vvv
Fat-Zer пишет:с bc надо быть осторожным... наивное выражение типа echo "scale=0; 1/9*100" | bc выдаст неожиданный результат... питон в качестве калькулятора в этом случае окажется надёжней и будет требовать меньше кода...

только то что написано: использование bc в скриптах без осмотрительности даёт большое количество ошибок...

"drBatty" написал:
В том смысле, что этот быдлокод выдаст какую-то ненужную ерунду, которая прямо зависит от фазы луны.

ИМХО ожидается, что он выдаст 11, т.е. просто отбросит дробную часть... и подставленным 1.0 делу не поможешь...

"drBatty" написал:
$ echo "1/9*100" | bc -l
11.11111111111111111100и в чём проблема?

как и везде, в том, что два последних разряда не правильные... и это надо самому округлять...

"drBatty" написал:
bash тут вообще не при чём, ибо там НЕТ дробных чисел. Ну то есть ВООБЩЕ.

дык, в этом и идея, что если FP нужны, то на bash'е лучше не писать...

"drBatty" написал:
лень. Да в принципе и одного достаточно, того, что в школе учат. Этот вариант постоянно используется, и равносилен умножению на ноль битов, которые получаются после вычитания битов левее 1(2^0) из 1/2. А фокус в том, что когда ты такие округлённые числа вычитаешь (например сравниваешь с другим целым), ты эти биты ДЕЛИШЬ НА НОЛЬ.Проблема в том, что твой питон этого НЕ ВИДИТ. В итоге лажается, и пишет какой-то бред. Который ты по наивности принимаешь за ответ.

ничего не понял...

"drBatty" написал:
а это тут при том, что числа, которые получил путём округления, НЕЛЬЗЯ использовать как целые. В частности их нельзя сравнивать друг с другом, и с любыми другими целыми.А вот теперь рассказывай: ЗАЧЕМ вообще тебе округлять?

при выводе дробные числа как-то принято округлять...

#345545

я так и не понял. где калькулятор для консоли?
в с++ помнится было такое что можно было подавлять лишние нули и "лишние" "цифры" - округление то есть.
как это в ком строке сделать?

пусть это будет какой то внешний установленный калькулятор консольный, мне свои скрипты все равно никуда не переносить

буду благодарен чрезмерно.
простая задача сводится на нет. тупо умножить "плавающую" цифру на не плавающую неужели это сложно в bash. (ответ - в bash ДА!)
ОПять вопрос - внешнюю утилиту какую посоветуете?

Войдите или зарегистрируйтесь, чтобы ответить.