eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPorównywanie liczb, double float › Re: Porównywanie liczb, double float
  • X-Received: by 2002:aed:2823:: with SMTP id r32mr7207449qtd.201.1578853035094; Sun,
    12 Jan 2020 10:17:15 -0800 (PST)
    X-Received: by 2002:aed:2823:: with SMTP id r32mr7207449qtd.201.1578853035094; Sun,
    12 Jan 2020 10:17:15 -0800 (PST)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erj
    e.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!news.mixmin.net!aioe
    .org!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media
    .com!news.highwinds-media.com!g89no2142566qtd.0!news-out.google.com!w29ni847qtc
    .0!nntp.google.com!g89no2142553qtd.0!postnews.google.com!google-groups.googlegr
    oups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Sun, 12 Jan 2020 10:17:14 -0800 (PST)
    In-Reply-To: <5...@g...com>
    Complaints-To: g...@g...com
    Injection-Info: google-groups.googlegroups.com; posting-host=93.174.24.49;
    posting-account=FE4hoAoAAADKg8EtnA4bEyQiJf7iqAgV
    NNTP-Posting-Host: 93.174.24.49
    References: <qdqqh6$n2f$1@dont-email.me> <5d00f035$0$15194$426a74cc@news.free.fr>
    <5d011217$0$17348$65785112@news.neostrada.pl>
    <qe65vo$18po$1@gioia.aioe.org>
    <5...@g...com>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <a...@g...com>
    Subject: Re: Porównywanie liczb, double float
    From: DMR <m...@g...com>
    Injection-Date: Sun, 12 Jan 2020 18:17:15 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    X-Received-Bytes: 3114
    X-Received-Body-CRC: 365716543
    Xref: news-archive.icm.edu.pl pl.comp.programming:214680
    [ ukryj nagłówki ]

    Sorunia za crossa, ale tu też o tym pisałem. :-)



    > Przykładowo, muszę zrobić: 12345.6789 zł -> 12345 zł 68 gr
    >
    > Wiadomo:
    >
    > double suma, f;
    > int zlote, grosze;
    >
    > ...
    >
    > suma += 0.005;
    >
    > zlote = (int)suma;
    > f = suma - zlote;
    > grosze = (int)(f * 100.0);
    >
    > Problemy mogą pojawić w przypadku wartości praktycznie równych
    > wartościom całkowitym.
    > Gdyby na skutek jakichś zaokrągleń wartość f okazała się ujemna,
    > to nie ma problemu - (int) i tak "dociągnie" ją do zera.
    >
    > Gorzej, gdyby np. suma = 1234.9999999999999997, za to teoretycznie
    > f = 0.9999999999999997 za sprawą zabłąkanego bitu na końcu przeskoczyła
    > na f = 1.0000000000000001.
    > Wtedy wyjdzie 1234 zł 100 gr...


    Ale jeśli zrobię tak:

    grosze = (int)(f * 99.99);

    to problem zniknie raz na zawsze.
    Rzecz jasna, wtedy sumy typu x.9951 zł przejdą na x zł 99 gr, co oczywiście formalnie
    jest błędem, ale - z drugiej strony - jeszcze poważniejszym błędem jest zaokrąglanie
    sum do pełnych groszy, przy jednoczesnym rozbijaniu tematu o pojedyncze miligrosze.

    No, ale pytanie jest zasadnicze - czy na skutek zaokrągleń, możliwe jest zajście
    przypadku:

    (Double - (int)Double) * 1Ex >= 1Ex

    dla "rozsądnych" wartości x (biorąc po uwagę zakresy typów, powiedzmy: 0-8)?
    Ktoś może potwierdzić/zaprzeczyć?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: