🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #215653

Re: Porównywanie liczb, double float

#215653
From: DMR
Date: Sun, 12 Jan 2020 18:17
43 lines
3012 bytes
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ć?
Technical Details
Message-ID: <ac723793-4866-4d78-9149-ba8bee9f55fa@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.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.googlegroups.com!not-for-mail
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> <5b09d1e0-1ed9-4a3c-851e-29cbf826cb3a@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:6214:38c:: with SMTP id l12mr8360708qvy.224.1578853035209;        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: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.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.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Sun, 12 Jan 2020 10:17:14 -0800 (PST)
In-Reply-To: <5b09d1e0-1ed9-4a3c-851e-29cbf826cb3a@googlegroups.com>
Complaints-To: groups-abuse@google.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> <5b09d1e0-1ed9-4a3c-851e-29cbf826cb3a@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <ac723793-4866-4d78-9149-ba8bee9f55fa@googlegroups.com>
Subject: Re: Porównywanie liczb, double float
From: DMR <mezzogm@gmail.com>
Injection-Date: Sun, 12 Jan 2020 18:17:15 +0000
X-Received-Bytes: 3114
X-Received-Body-CRC: 365716543
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit