Автор Тема: Математически изрази с десетична точка  (Прочетена 1207 пъти)

qwerty11

  • Напреднали
  • *****
  • Публикации: 23
    • Профил
Нещо елементарно, но немога да се справяяя, на няколко ракии затъпявам.
Трябва да събера две числа 1 + 1.1,   с let и expr май нестава, а вариянта със echo 0.04 - 0.05  | bc ми дава кофти форматиране от -.01 , и от там да слагам sed не искам.
 Някой да каже вариянт.
« Последна редакция: Sep 09, 2010, 21:28 от qwerty11 »
Активен

koue

  • Напреднали
  • *****
  • Публикации: 74
  • Distribution: FreeBSD
  • Window Manager: fluxbox
    • Профил
echo 2 + 3.4 | bc
Активен

Спрете да им прощавате, че не знаят какво правят!

qwerty11

  • Напреднали
  • *****
  • Публикации: 23
    • Профил
echo 2 + 3.4 | bc

а вариянта със echo 0.04 - 0.05 ми дава кофти форматиране от -.01
 Нещо друго
Активен

morbid_viper

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: (Open)SUSE since v5.3 (1999)
  • Window Manager: KDE ориентиран
    • Профил
имай предвид, че bash много-много не разбира от реални числа – само целочислени…
затова и се ползва bc

особено коварно е при разни сравнения… доста съм си блъскал главата в стената с тая простотия.

все пак виж това:
       echo $(printf "%f\n" `echo 0.04 - 0.05 | bc`)
имай предвид, че за различни локали може да не работи както си мислиш, например на български (LANG=bg_BG.UTF-8) ще очаква десетична запетая, но bc няма как да се сети за това и ще очаква десетична точка.
« Последна редакция: Sep 09, 2010, 22:21 от morbid_viper »
Активен

-------------------------------------------------
Blessed are we to taste this life of sin!
-------------------------------------------------
Registered Linux user #251276

qwerty11

  • Напреднали
  • *****
  • Публикации: 23
    • Профил
мерси morbid_viper, поне за мен това е по-добро решение от обработката със SED. Резултата го подавам на if и става неочакваното. Пий една бира  [_]3
Активен

morbid_viper

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: (Open)SUSE since v5.3 (1999)
  • Window Manager: KDE ориентиран
    • Профил
… Резултата го подавам на if и става неочакваното…

както писах по-горе bash не се погажда с десетични дробни числа и няма да можеш много лесно да го използваш за сравнение в if. препоръчвам ти да заобиколиш това като умножиш и двете сравнявани стойности с достатъчно голямо число, така, че да промениш разрядността и да не те интересува дробната част. например, искаш да сравниш 5,6 с 4,92. умножаваш ги двете със 100 и получаваш съответно 560 и 492. тук вече bash ще откликне по-отзивчиво  :-)

ако не знаеш предварително колко ти е най-голямата точност след запетаята можеш да пробваш нещо от сорта на:
    echo -n "30,45446"| cut -s -d "," -f2-|wc -m
като съответно си промениш точката или запетаята според твоя локал. горното дава желания резултат +1 (което не ми се занимава да разбера защо cut добавя един нов ред и той влиза в сметката после), но за целта на занятието става.
остава ти да направиш едно:
    echo $(( 10**6 ))
където 6 е резултатът от горната сметка и ще получиш числото, с което трябва да умножиш двете дробни стойности за да се отървеш от десетичната част.

успех!
« Последна редакция: Sep 09, 2010, 23:55 от morbid_viper »
Активен

-------------------------------------------------
Blessed are we to taste this life of sin!
-------------------------------------------------
Registered Linux user #251276