Kom ihåg mig?

Problem med subtraktion i PHP

Ämnesverktyg Visningsalternativ
Oläst 2009-03-20, 15:28 #1
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
Jag förväntade mig inte att springa på detta problemet men så blev det. Egentligen så är det inget problem men jag undrar ändå varför det blir som det blir.

Kod:
echo 11103-11103.35; exit;
På min utvecklingsdator får jag följade resultat:
-0.35000000000036

På en av mina webbservrar får jag:
-0.35

Det jag undrar över är varför min utvecklingsdator räknar fel. Jag är medveten om att division och multiplikation kan ge decimalproblem för processorer men detta är ju en simpel subtraktion.
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-03-20, 15:33 #2
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Vad händer om du skriver 11103.0-11103.35?
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-03-20, 17:36 #3
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Jag tror att det har att göra med vad som står i PHP-manualen:
Citat:
It is typical that simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9.

This is due to the fact that it is impossible to express some fractions in decimal notation with a finite number of digits. For instance, 1/3 in decimal form becomes 0.3.

So never trust floating number results to the last digit, and never compare floating point numbers for equality. If higher precision is necessary, the arbitrary precision math functions and gmp functions are available.
d.v.s. det är något krux när PHP översätter mellan binärt och tillbaka. Läs mer här: http://se.php.net/float
Althalos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-03-20, 22:26 #4
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Om du kollar phpinfo() och värdet "precision", vad säger det? Eftersom detta direktiv talar om hur många decimaler du hanterar i flyttal.
Kod:
 echo (float) 11103 - (float) 11103.35; exit;
Vad händer då?
Citat:
11103 - 11103.35
-0.35
11103.0 - 11103.35
-0.35
(float) 11103 - (float) 11103.35
-0.35
(Mitt precision värde är 20)
Får jag på min server.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-03-23, 04:01 #5
iXam iXam är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 219
iXam iXam är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 219
; The number of significant digits displayed in floating point numbers.
precision = 12

i php.ini kanske kan ha något med saken att göra?
iXam är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-03-23, 10:13 #6
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
Citat:
Originally posted by FredrikMH@Mar 20 2009, 16:28
Jag förväntade mig inte att springa på detta problemet men så blev det. Egentligen så är det inget problem men jag undrar ändå varför det blir som det blir.
Kod:
echo 11103-11103.35; exit;
På min utvecklingsdator får jag följade resultat:
-0.35000000000036
På en av mina webbservrar får jag:
-0.35
Det jag undrar över är varför min utvecklingsdator räknar fel. Jag är medveten om att division och multiplikation kan ge decimalproblem för processorer men detta är ju en simpel subtraktion.
Båda dina datorer räknar rätt kan man säga!

Flyttal är dyrt att räkna och lagra, och därför gör man ofta en approximation. Det skall du alltid ha i minnet när du räknar med decimaler. 1/3 = 0.333333... går t.ex. inte att lagra som ett komplett tal, då de har ett oändligt antal decimaler. Vad man gör är då är att bara ta med ett visst antal decimaler, så kallad precision (se iXams inlägg). Tal som är både stora och små samidigt är extra besvärliga (t.ex. 12343535.000000034323) på grund av det sättet som man lagrar flyttal.
coredev är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 20:33.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017