logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

BASCOM: Jak dokładnie konwertować stringi na typ SINGLE?

sundayman 24 Lut 2013 21:22 1401 7
REKLAMA
  • #1 11982345
    sundayman
    Poziom 26  
    Takie mam problemik.

    Otóż mam w stringu wartość typu "843.30" - przecinek może być na różnej pozycji, czyli może to być np. "3.423"

    Potrzebuję toto zamienić na wartość liczbową, więc przepisuję do zmiennej typu SINGLE.
    Ale - dla stringu "84.2" otrzymuję wartość zmiennej 84.199996946

    Jak sądzę, jest to problem konwersji do single - czy jest jakiś sposób, aby otrzymać
    tą wartość dokładnie taką jak w stringu ?

    Round(x) zaokrągla do pełnych wartości, więc nie pomaga...
  • REKLAMA
  • #2 11982519
    ZbeeGin
    Poziom 39  
    sundayman napisał:
    Ale - dla stringu "84.2" otrzymuję wartość zmiennej 84.199996946

    Niestety rozdzielczość zmiennych typu Single jest skończona i nie można w nich zapisać każdej liczby zmiennoprzecinkowej.

    sundayman napisał:
    Jak sądzę, jest to problem konwersji do single - czy jest jakiś sposób, aby otrzymać tą wartość dokładnie taką jak w stringu ?

    Jeśli masz dużo pamięci RAM to zastosuj zmienną Double.
    Druga metoda to przechowywanie otrzymywanych liczb w dwóch zmiennych stałoprzecinkowych np. Word. Jedna zmienna pamięta część całkowitą, a druga ułamkową. Skomplikuje to nieco obliczenia, ale wyeliminuje "rounding" liczb zmiennoprzecinkowych.
  • REKLAMA
  • #3 11982564
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 11982751
    sundayman
    Poziom 26  
    Niezupełnie - chodzi o to, że do programu wartość jest dostarczana właśnie jako string. Muszę mieć natomiast zmienna, aby móc ją porównywać z zadaną wartością (mniejsza, większa itp).

    Ale nie może być tak, że zamiast 84.2 (która to wartość jest prawdziwa, i taka jest w stringu), to
    do porównania używam 84.199999 czy coś podobnego.

    Mógłbym usuwać przecinek , i stosować tylko stałe, ale z uwagi na zmienną pozycję przecinka, jest to kłopot.

    Zaraz spróbuję twojego pomysłu.
  • #5 11982787
    BlueDraco
    Specjalista - Mikrokontrolery
    To nie jest błąd - tak właśnie zachowują się liczby zmiennopozycyjne. Zapis zmiennopozycyjny jest w ogólnym przypadku zapisem przybliżonym, dlatego np. nie ma sensu pytanie o równość dwóch liczb.
  • #6 11982912
    sundayman
    Poziom 26  
    No ale jednak w przypadku, kiedy liczba nie jest niewymierna, no powinna być zmiennoprzecinkowo zapisana dokładnie chyba...
    Przynajmniej w jakimś zakresie (nie wymagam, żeby 3.1415926535 było konwertowane dokładnie na zmiennoprzecinkową, ale 84.2 to już chyba można...)

    Rozwiązanie z Config Single działa , i chyba tak zostawię.
  • REKLAMA
  • #7 11983249
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie ma takiej możliwości, żeby była zapisana dokładnie, chyba, że przypadkowo jest sumą potęg dwójki.
  • #8 11987012
    nproton
    Poziom 12  
    To zależy do czego chcesz stosować te cyfry, jak tylko porównanie to możesz trzymać w dwóch zmiennych. Oddzielnie część całkowitą i oddzielnie ułamkową, tylko ułamkową musisz uzupełniać zerami do stałej długości. Można też porównywać stringi bez konwersji na liczby, najłatwiej to zrobić uzupełniając string zerami z przodu i z tyłu do określonej długości a następnie porównując od lewej który kod ASCII jest większy.
REKLAMA