Avatar billede Slettet bruger
04. april 2011 - 17:06 Der er 8 kommentarer og
1 løsning

Alvorlig fejl i json_encode() !

Den "afrunder" store integers !!

Hvis jeg fra php sender:
echo json_encode( array("1968401665333658496", 1968401665333658496) );

Modtager browseren:
[ "1968401665333658496"  ,  1968401665333658600 ]

Og det er jo langtfra det samme tal : (
- specielt ikke når tallet repræsenterer en unik (BIGINT) nøgle i databasen...

Har andre oplevet det samme, og kan man gøre noget ved det ?
Avatar billede Slettet bruger
04. april 2011 - 17:13 #1
Kan lige tilføje, at både PHP, javascript og MySQL har det helt fint med integers i denne størrelse.
- det går først galt, når json_encode() kommer ind i billedet.
Avatar billede michael_stim Ekspert
04. april 2011 - 17:20 #2
Ved ikke om det har noget at sige, men nu er det tal jo også noget større end en integer. Nu ved jeg intet om Json, men kan man deklarere som big int eller lignende?
Avatar billede michael_stim Ekspert
04. april 2011 - 17:26 #3
Nu har jeg ikke læst det igennem, men ser ud til at andre har samme problem.

http://forum.developers.facebook.net/viewtopic.php?id=20846
Avatar billede repox Seniormester
04. april 2011 - 17:26 #4
Send tallet med som en streng i stedet - problem solved...
Avatar billede michael_stim Ekspert
04. april 2011 - 17:30 #5
Tror jeg også de kom frem til i den tråd jeg linkede til ;o)
Avatar billede Slettet bruger
04. april 2011 - 17:39 #6
#3 - det kigger jeg på, tak.

#4 - det kan jeg jo blive nødt til..

Bare ærgeligt, fordi jeg sender data-arrays direkte fra databasen og videre til browseren igennem json_encode..

Alternativet er, enten at få tallet konverteret af MySQL-serveren (dyrt)
- eller selv at steppe igennem arrayet og teste om værdien er større end xxx, og så ændre den til en streng (langsomt)

Og igen ude i browseren, konvertere tilbage igen..
Bøvl bøvl bøvl
Avatar billede repox Seniormester
04. april 2011 - 17:41 #7
Det er desuden også måden PHP normalt vil arbejde med så store tal på - så det er der såmænd ikke noget lusket i...
Avatar billede Slettet bruger
04. april 2011 - 17:55 #8
#7 Nej, problemet opstår først når json_encode får fingre i det.
- indtil da er der ingen problemer.

PHP_INT_MAX = 9223372036854775807 (både herhjemme og hos Servage.net)
Avatar billede Slettet bruger
04. april 2011 - 20:10 #9
OK - Endnu lidt klogere idag : )

- Det viser sig at:
Javascript has no concept of integers, according to the standard all numbers are IEEE doubles, which means they have 52 bits of mantissa. this leads to a practical maximum "integer" value of 2^53 before any loss of precision.

2^53 = 9007199254740992

Tankevækkende at man kan arbejde professionelt med skidtet i 15 år uden at vide noget så basalt..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester