Autor Zpráva
nothrem
Profil
Ahoj, mám php program (běží na php 5.1.4), který z DB vytáhne několik hodnot, sečte je společně s hodnotami zadanými uživatelem a uloží zpět.

Narazil jsem ale na problém, že výsledek se liší podle pořadí sčítaných prvků a pak to dělá bordel v databázi:

např.:

670.00 + 250.06 - 920.06 = 0
670.00 - 920.06 + 250.06 = -5.6843418860808E-014
- 920.06 + 670.00 + 250.06 = 0


To si mam nejdřív čísla seřadit podle velikosti a pak je teprve sčítat???
Nebo jak jinak se zbavit téhle chyby když nevim v jakých rozsazích se pohybuje ta chyba a v jakých skutečné hodnoty...

Díky
tiso
Profil
Použi zaokrúhľovanie...
zivan
Profil
Podobne tema:
http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=21 001
nothrem
Profil
zivan: díky

tiso: To je právě ten problém co jsem psal, protože skutečné hodnoty mohou jít řádově do podobných hodnot jako ta chyba a nemůžu si dovolit ztratit přesnost zaokrouhlením.
zivan
Profil
Muzes zaokrouhlovat treba az na patem desetinnem miste.

x = Math.round(x*100000)/100000;
nothrem
Profil
v mém případě bych musel zaokrouhlovat asi tak na 12. místě, ale zatím jsem to vyřešil tak jak jsem psal - čísla seřadim a pak teprve sečtu; resp:
foreach ($cisla as $cislo)

{
if (cislo > 0))
{
$kladna += $cislo;
}
else
{
$zaporna += $cislo;
}
}
$soucet = $kladna + $zaporna;

Zdá se, že tohle ten problém odstraňuje nebo alespoň minimalizuje. Uvidim jestli se problém objeví, až se v programu spustí skutečná data...

BTW je v php něco přesnějšího než double?
zivan
Profil
No nevim, jestli ten cyklus nejak pomuze. Porad pracujes s realnymi cisly a projevuje se zaokrouhlovani (nejen u scitani velkych a malych cisel, ale i u ukladani vysledku do pameti).

Napada me nekolik moznosti, jak se vyhnout zaokrouhlovani (jestli je to pro tebe takovy problem):

1) uchovavat realna cisla jako retezece a vytvorit si vlastni fce na zakladni operace
2) uchovavat realna cisla jako zlomky a vytvorit si vlastni fce na zakladni operace
3) uchovavat zvlast hodnotu cele a desetinne casti a na tyto casti by slo castecne pouzivat celociselne operace
Toto téma je uzamčeno. Odpověď nelze zaslat.