PHP: Getal afronden achter de komma

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • SamuraiP1zzaCat
  • Registratie: Augustus 2005
  • Laatst online: 07-04 20:21
Hi,

Zit al van alles te proberen maar ik krijg een rare output. Wat doe ik verkeerd?
Ik wil een getal flink achter de comma weten.

Ik heb dit geset:
ini_set('precision', 20);

En ik wil deze rekensom:
$getal = 0.00000063;
$getal2 = $getal*0.9;
echo round("$getal2", 8, PHP_ROUND_HALF_UP);

Nu komt hier het volgende uit:
5.7000000000000004832E-7

Hoe krijg ik hier gewoon 0.00000057 uit....

_/-\o_

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Gaat het om weergave of om opslag van dit getal?

Zie ook http://php.net/manual/pl/language.types.float.php

[ Voor 38% gewijzigd door GlowMouse op 02-09-2017 19:29 ]


Acties:
  • 0 Henk 'm!

  • SL3Y4R
  • Registratie: Juni 2014
  • Laatst online: 30-06 14:35
Probeer eens om die getallen keer 10000 (of hoger) doen?

Acties:
  • 0 Henk 'm!

  • SamuraiP1zzaCat
  • Registratie: Augustus 2005
  • Laatst online: 07-04 20:21
GlowMouse schreef op zaterdag 2 september 2017 @ 19:28:
Gaat het om weergave of om opslag van dit getal?
Opslag. Maar maakt dat uit dan?

Acties:
  • +1 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Jazeker. Getallen worden binair opgeslagen, en daarvoor zijn een aantal types beschikbaar. Integers zijn nauwkeurig, maar hebben een beperkt bereik. Nu heb je een double, die heeft een groot bereik (ook achter de komma), maar de precisie is beperkt tot 13-15 significante cijfers (zie de link die ik eerder gaf). Als je met een heel hoge precisie wilt rekenen met getallen achter de komma, kun je bcmath in php gebruiken, en de getallen als string opslaan. Ze nemen dan wel meer ruimte in. Een alternatief, als je het bereik kent, is de getallen omzetten naar integers (bijvoorbeeld bedragen opslaan in centen ipv in euro's).

Om van opslag naar weergave te gaan, zet je een getal om in een string (bv. met sprintf).

[ Voor 30% gewijzigd door GlowMouse op 02-09-2017 19:36 ]


Acties:
  • 0 Henk 'm!

  • route99
  • Registratie: Augustus 2017
  • Laatst online: 05-06-2024

route99

just passionately curious...

https://www.google.nl/sea...i131k1j0i10k1.WxGYwCdT0IY
Kun je hier mee vooruit. ik zag dat er voorbeelden gegeven werden bij de diverse links

Acties:
  • 0 Henk 'm!

  • SamuraiP1zzaCat
  • Registratie: Augustus 2005
  • Laatst online: 07-04 20:21
route99 schreef op zaterdag 2 september 2017 @ 19:33:
https://www.google.nl/sea...i131k1j0i10k1.WxGYwCdT0IY
Kun je hier mee vooruit. ik zag dat er voorbeelden gegeven werden bij de diverse links
Ok thanks ik ga ff proberen

Acties:
  • 0 Henk 'm!

  • route99
  • Registratie: Augustus 2017
  • Laatst online: 05-06-2024

route99

just passionately curious...

Tipje extra: je hoeft niet te quoten als je direct er onder antwoord... wordt zo rommelig/druk.. Iedereen snapt het ook zonder..
Succes verder !

Acties:
  • 0 Henk 'm!

  • SamuraiP1zzaCat
  • Registratie: Augustus 2005
  • Laatst online: 07-04 20:21
Voor iemand die het zoekt, het was simpel:

echo number_format("$getal2",8);

Waar 8 de precisie is

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
SamuraiP1zzaCat schreef op zaterdag 2 september 2017 @ 19:54:
Voor iemand die het zoekt, het was simpel:

echo number_format("$getal2",8);

Waar 8 de precisie is
Voor die ene rekensom werkt het prima, maar bij een precisie van 16 zal dit niet werken. Voor pow(10,8)+0.1 werkt het ook niet:
>php -r "echo number_format(pow(10,8)+0.1, 8);"
100,000,000.09999999
Het is me ook niet duidelijk waarom je $getal2 tussen quotes zet.

[ Voor 9% gewijzigd door GlowMouse op 02-09-2017 20:07 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-06 13:51

NMe

Quia Ego Sic Dico.

SL3Y4R schreef op zaterdag 2 september 2017 @ 19:29:
Probeer eens om die getallen keer 10000 (of hoger) doen?
Waarom? Wat denk je dat die E-7 betekent? ;)

[ Voor 12% gewijzigd door NMe op 02-09-2017 21:35 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • SL3Y4R
  • Registratie: Juni 2014
  • Laatst online: 30-06 14:35
Bedoelde het eerste getal. Dan kun je de uitkomst weer terug delen. (Het zelfde idee als hierboven al beschreven werdt met centen)

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:55

Reptile209

- gers -

Wat @NMe bedoelt, is dat 5.7000000000000004832E-7 en 0.00000057 hetzelfde getal zijn. Dat kan je vermenigvuldigen en delen tot je een ons weegt, maar het wordt niet anders (op de garbage in de niet-significante cijfers na dan).

Het is een kwestie van weergave. In elke zichzelf respecterende programmeertaal kan de programmeur kiezen hoe dat getal moet worden weergegeven: als 10, 1.0e+1, 0xA of 1010b. Intern ziet het er - kort door de bocht - allemaal hetzelfde uit.

Je moet dus a) het juiste data-type kiezen (met voldoende precisie voor je bereik) en dan b) daar de gewenste weergave aan koppelen.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:46

.oisyn

Moderator Devschuur®

Demotivational Speaker

GlowMouse schreef op zaterdag 2 september 2017 @ 19:31:
[...]

Jazeker. Getallen worden binair opgeslagen, en daarvoor zijn een aantal types beschikbaar. Integers zijn nauwkeurig, maar hebben een beperkt bereik. Nu heb je een double, die heeft een groot bereik (ook achter de komma), maar de precisie is beperkt tot 13-15 significante cijfers (zie de link die ik eerder gaf).
Let wel, een (32 bits) integer in php is niet nauwkeuriger dan een float. Een float kan al die ints exact representeren, en meer (t/m 253) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
.oisyn schreef op zondag 3 september 2017 @ 19:34:
Let wel, een (32 bits) integer in php is niet nauwkeuriger dan een float. Een float kan al die ints exact representeren, en meer (t/m 253) :)
Dat klopt niet helemaal: een int en een float bestaan allebei uit 4 bytes ofwel 32 bits.In de int worden alle bits gebruikt voor de getalswaarde, die daarmee elke gehele waarde kan aannemen in de range [-2147483648;2147483647] met dezelfde nauwkeurigheid.
In de float worden 8 van de 32 bits (1 byte) gebruikt voor de exponent en 1 bit voor het teken. Hiermee blijven 23 bits over voor de mantisse. De mantisse wordt vermenigvuldigd met een waarde die afgeleid wordt uit de exponent om de getalswaarde van de float te bepalen. Het aantal bits in de mantisse bepaalt de nauwkeurigheid die dus flink lager ligt dan die van een int.
Meer informatie is gemakkelijk te vinden als je zoekt op IEEE 754. Bijvoorbeeld hier: http://steve.hollasch.net/cgindex/coding/ieeefloat.html.
Je zou het ook zo kunnen zeggen: omdat zowel een float als een int 32 bits tot hun beschikking hebben, kunnen ze in principe evenveel getallen uitdrukken. Bij een int zijn dat alleen gehele getallen, bij een float ook gebroken (rationale) getallen. Er blijven bij een float dus minder mogelijkheden over voor de gehele getallen.

[ Voor 13% gewijzigd door sam.vimes op 16-09-2017 09:23 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:46

.oisyn

Moderator Devschuur®

Demotivational Speaker

sam.vimes schreef op zaterdag 16 september 2017 @ 09:15:
[...]

Dat klopt niet helemaal: een int en een float bestaan allebei uit 4 bytes ofwel 32 bits.
Een float in PHP is 64 bits :). Je hebt dus effectief 53 mantissabits, ruim genoeg voor een 32 bits int.

De term "float" komt uit C, het is geen officiele IEEE 754 term. Die laatste gebruikt "single precision" en "double precision".

[ Voor 30% gewijzigd door .oisyn op 16-09-2017 09:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
My bad, excuus. Ik ken PHP niet goed genoeg meer. Een PHP float komt dus overeen met een double in Java, C en C++.
http://php.net/manual/en/language.types.float.php
In dat geval is de mantisse 47 bits: 64 -16 (voor de exponent) -1 (voor het teken).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:46

.oisyn

Moderator Devschuur®

Demotivational Speaker

sam.vimes schreef op zaterdag 16 september 2017 @ 10:20:
[...]

My bad, excuus. Ik ken PHP niet goed genoeg meer. Een PHP float komt dus overeen met een double in Java, C en C++.
http://php.net/manual/en/language.types.float.php
In dat geval is de mantisse 47 bits: 64 -16 (voor de exponent) -1 (voor het teken).
Sorry, maar nee. Een double precision float heeft 11 exponent bits, 1 sign bit en 52 mantissa bits. Met de geïmpliceerde 1 heb je dus effectief 53 mantissa bits :)

Wikipedia: IEEE 754

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
SamuraiP1zzaCat schreef op zaterdag 2 september 2017 @ 19:54:
Voor iemand die het zoekt, het was simpel:

echo number_format("$getal2",8);

Waar 8 de precisie is
Bijna goed, haal de aanhalingstekens even weg om $getal2

Maak je niet druk, dat doet de compressor maar

Pagina: 1