🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.programming
Article #215648

Re: Porównywanie liczb, double float

#215648
From: fir
Date: Mon, 22 Jul 2019 15:24
47 lines
3126 bytes
W dniu piątek, 12 lipca 2019 07:27:56 UTC+2 użytkownik DMR napisał:
> > Zamieszcze tu po raz 473 w ciagu 20 lat podstawową formułkę
> > (Ba! KANON!)
> 
> 
> To ja poprosiłbym o jakiś patent na odporne na zaokrąglenia rozdzielenie części całkowitej i ułamkowej w zmiennej typu double.
> 
> 
> 
> > ponaglenia o pilną zapłatę 0.00PLN
> 
> 
> No właśnie.
> 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...
> 
> Chyba, że nie potrzebnie się martwię.
> Testowałem to wielokrotnie dla miliardów złośliwie wygenerowanych danych "z pogranicza" - ani razu się nie wywaliła.
> 
> No, ale... :-)

chyba cos kolega piepszy

   zlote = (int)suma;
   f = suma - zlote;
   grosze = (int)(f * 100.0);

nie chce mi sie nad tym za dlugo zastanawiac ale na oko to bedzie dzialac
zawsze poprawnie (zakladam ze wartosc suma jest dodatnia i ze chodzi o zaokraglenie w dol, nie mam pojecia jakie reguly zaokraglania pieniedzy panuja w bankach)
Technical Details
Message-ID: <0af226e9-7a1a-4af3-ba0c-bbc2cbd865f8@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!takemy.news.telefonica.de!telefonica.de!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!b26no2220485qtq.0!news-out.google.com!e17ni1148qtg.1!nntp.google.com!b26no2220482qtq.0!postnews.google.com!glegroupsg2000goo.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:ac8:6b50:: with SMTP id x16mr51439328qts.246.1563809086633;        Mon, 22 Jul 2019 08:24:46 -0700 (PDT)
X-Received: by 2002:ae9:f016:: with SMTP id l22mr47482815qkg.51.1563809086537; Mon, 22 Jul 2019 08:24:46 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!takemy.news.telefonica.de!telefonica.de!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!b26no2220485qtq.0!news-out.google.com!e17ni1148qtg.1!nntp.google.com!b26no2220482qtq.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Mon, 22 Jul 2019 08:24:46 -0700 (PDT)
In-Reply-To: <5b09d1e0-1ed9-4a3c-851e-29cbf826cb3a@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=5.172.255.80; posting-account=Sb6m8goAAABbWsBL7gouk3bfLsuxwMgN
NNTP-Posting-Host: 5.172.255.80
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: <0af226e9-7a1a-4af3-ba0c-bbc2cbd865f8@googlegroups.com>
Subject: Re: Porównywanie liczb, double float
From: fir <profesor.fir@gmail.com>
Injection-Date: Mon, 22 Jul 2019 15:24:46 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit