🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #231113

Re: Problem z właściwym sumowaniem

#231113
From: artiun
Date: Tue, 14 Jul 2015 14:01
85 lines
3727 bytes
W dniu 2015-07-14 o 09:56, tomek pisze:
> Użytkownik "Borys Pogoreło" <borys@pl.edu.leszno> napisał w wiadomości
> news:12ptonkwkgs46.11ond3800czpd$.dlg@40tude.net...
>> Dnia Mon, 13 Jul 2015 12:11:53 +0200, tomek napisał(a):
>>
>>> SELECT [...]
>>> CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr,
>>> [...]
>>>
>>> Wszystkie operacje wykonuję na groszach.
>>> Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na
>>> stringa
>
>> A jak sobie radzisz z mnożeniem? Bo na 32-bitowych maszynach PHP_INT_MAX
>> wcale taki duży nie jest. A wynik mnożenia większych liczb może dość łatwo
>> przekroczyć 2147483647, jeśli oba czynniki masz pomnożone przez 100.
>
> PHP to nie C czy inny język.
> Jak się pomnoży np
>      $x = 0.23 * $kwota_w_groszach
> to i tak to będzie FLOAT a nie INTEGER.
>
> Funkcja "round" też zwraca float.
>
> Chodzi mi oto aby nie było takich numerów jak poniżej
> ---------------------------------------------------------------
> $NL = "\n";
>
> $x1 = 0.2;
> $x2 = 0.12;
> $x3 = 0.08;
>
> // teoretycznie to samo ale daje inne wyniki
> $x = $x1 - $x2 - $x3;
> echo $x.$NL;
> $x = -$x2 - $x3 + $x1;
> echo $x.$NL;
>
> --------------------------------------------------------------------
> 1.3877787807814E-17
> 0
>
Może język inny, ale rzutowanie jest (on pisał o operacjach na int):

<?php

$NL = "\n";

$x1 = 0.2;
$x2 = 0.12;
$x3 = 0.08;

$x = (int)($x1*100) - (int)($x2*100) - (int)($x3*100);
echo $x.$NL;
$x = -$x2 - $x3 + $x1;
echo $x.$NL;

?>

WYNIK TEN SAM.

Przykład wcześniejszy:

$x = 0.23 * $kwota_w_groszach

<?php

$NL = "\n";

$kwota_w_groszach = 177777;

$x = 0.23 * $kwota_w_groszach;

echo gettype( $x ).$NL;

// Takie liczenie było by złe
echo gettype( (int)$x ).$NL;

// To nie jest float, nie ma to znaczenia bo po przecinku są same zera
echo gettype( round( $x.$NL, 0 ) ).$NL;

?>

-- 
Artur
Technical Details
Message-ID: <55a5164e$0$8389$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!takemy.news.telefonica.de!telefonica.de!feeder2.ecngs.de!ecngs!feeder.ecngs.de!81.171.118.63.MISMATCH!peer03.fr7!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <9ecf2928-3e4b-4d12-8383-9217f3a32d17@googlegroups.com> <55a38ee3$0$2188$65785112@news.neostrada.pl> <12ptonkwkgs46.11ond3800czpd$.dlg@40tude.net> <55a4c0bf$0$8368$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!takemy.news.telefonica.de!telefonica.de!feeder2.ecngs.de!ecngs!feeder.ecngs.de!81.171.118.63.MISMATCH!peer03.fr7!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Tue, 14 Jul 2015 16:01:38 +0200
From: artiun <artiun@spam.wp.pl>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; pl-PL; rv:1.8.1.3) Gecko/20070326 Thunderbird/2.0.0.0 Mnenhy/0.7.5.0
MIME-Version: 1.0
Newsgroups: pl.comp.lang.php
Subject: Re: Problem z właściwym sumowaniem
References: <9ecf2928-3e4b-4d12-8383-9217f3a32d17@googlegroups.com> <55a38ee3$0$2188$65785112@news.neostrada.pl> <12ptonkwkgs46.11ond3800czpd$.dlg@40tude.net> <55a4c0bf$0$8368$65785112@news.neostrada.pl>
In-Reply-To: <55a4c0bf$0$8368$65785112@news.neostrada.pl>
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAAFXRFWHRDcmVhdGlvbiBUaW1l AAfVBwEUExQxoOF6AAAAB3RJTUUH1QcBFCMjg1qR9gAAAAlwSFlzAAAK8AAACvABQqw0mAAAAAZQ TFRFAAAA////pdmf3QAAAHZJREFUeNpj+A8GDFSjHoOpf8xg6oA8iPrHAJb7wQ+mPtSDqYcQDc+f I1MPW/hB1AMGMPWDGSTY+F+ujvk/QwOjAQ8DP8MBBgEWBkaGj//kVP6z43AEM4QCGtIPpBoYGOfU M/x//IFxDkTJHghVC6F+U9HvQAAATjr8CsUXDxIAAAAASUVORK5CYII=
X-Antivirus: avast! (VPS 150714-0, 2015-07-14), Outbound message
X-Antivirus-Status: Clean
Lines: 85
Message-ID: <55a5164e$0$8389$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 83.22.80.73
X-Trace: 1436882510 unt-rea-b-01.news.neostrada.pl 8389 83.22.80.73:8144
X-Complaints-To: abuse@news.neostrada.pl
X-Received-Bytes: 3463
X-Received-Body-CRC: 4251524619
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit