Avatar billede acid-head Nybegynder
06. april 2005 - 15:02 Der er 25 kommentarer og
1 løsning

Mærkeligt problem. $tal og (int)$tal ikke det samme?

Hej eksperter..

Jeg har en funktion som ændre et tal fx 0.57 til 57. Eller det vil sige, jeg har en funktion, som finder antallet af cifre efter komma:

function gang_op($tal)
{
  $ti = 1;
  $q = strlen(strstr($tal,'.'))-1;
  for($i=0;$i<$q;$i++)
    $ti=$ti*10;
 
  return $ti;
}

Hvis man så gør sådan her:

$tal = 0.57;

//Her returnerer gang_op 100, og $ny_tal bliver 57
$ny_tal = gang_op($tal)*$tal;

//Denne viser 56
echo (int)$ny_tal;

//Denne viser 57
echo $ny_tal;

Hvorfor dette mærkelige problem? Er det fordi jeg har rodet nogle stings rodet ind i det?
Avatar billede Slettet bruger
06. april 2005 - 15:56 #1
Hvis du bare skal konvertere fx 0.57 til 57, hvorfor ikke gøre sådan:

<?php
function myconvert($number) {
  return (int) substr($number, (strpos($number, ".") + 1));
}
?>
Avatar billede Slettet bruger
06. april 2005 - 16:01 #2
Men ellers burde denne gang_op funktion virke ens med og uden (int) foran:

<?php
function gang_op($number) {
  return pow(10, (strlen(strstr($number, '.')) - 1));
}
?>
Avatar billede acid-head Nybegynder
06. april 2005 - 16:03 #3
Jeg skal bruge de 100 igen senere, derfor var det rart at have et script, som generer tallet 10^("antallet af tal efter komma")
Avatar billede Slettet bruger
06. april 2005 - 16:04 #4
Det gør den jeg skrev 06/04-2005 16:01:21
Avatar billede acid-head Nybegynder
06. april 2005 - 16:11 #5
Jeps.. Men problemet er der stadigt..:

$tal = 0.57;
echo $tal;
$faktor = gang_op($tal);
echo $faktor;
$produkt = $faktor*$tal;
echo $produkt;
echo (int)$produkt;

giver

0.57
100
57
56

???
Avatar billede acid-head Nybegynder
06. april 2005 - 16:14 #6
Det bliver forresten først rigtigt et problem senere i mit program, hvor jeg skal primfaktor-opløse $produkt. Da gør det nemlig en forskel..

Hvis jeg primfaktor-opløser $produkt får jeg:
primfak($produkt);

2, 2, 2, 7.125

Hvilket jo ikke giver mening, med et kommatal..

Men primfaktor-opløser jeg derimod med tallet som parameter får jeg det rigtige:
primfak(57);

3, 19
Avatar billede Slettet bruger
06. april 2005 - 16:15 #7
Hvad outputter:

<?php
$tal = 0.57;

$faktor = gang_op($tal);
$produkt = $faktor*$tal;

var_dumb($faktor);
var_dumb($produkt);
?>

og hvad sker der hvis:
<?php
echo gang_op((string) $tal)
?>
?
Avatar billede acid-head Nybegynder
06. april 2005 - 16:17 #8
var_dumb($faktor); //siger int(100)
var_dumb($produkt); //siger float(57)
Avatar billede acid-head Nybegynder
06. april 2005 - 16:17 #9
echo gang_op((string) $tal); //giver 100
Avatar billede Slettet bruger
06. april 2005 - 16:20 #10
Hvad så med

<?php
$produkt = (int) $faktor * $tal;
var_dumb($produkt);
?>

?
Avatar billede Slettet bruger
06. april 2005 - 16:21 #11
Jeg tror ikke jeg kan hjælpe.. Desværre.. For mig ser tingene rigtige ud.. Beklager :)
Avatar billede acid-head Nybegynder
06. april 2005 - 16:25 #12
16:20:49 giver ingen forskel..

Øv, altså.. :) Men det er sQ også mærkeligt..
Avatar billede Slettet bruger
06. april 2005 - 16:27 #13
Ja.. Hvilken PHP version bruger du?
Avatar billede acid-head Nybegynder
06. april 2005 - 16:30 #14
Jeg bruger PHP Version 4.3.2,m men prøvede den lige på in egen maskine hvor jeg bruger PHP Version 5.0.0, og problemet er der stadig..
Avatar billede acid-head Nybegynder
06. april 2005 - 16:48 #15
function gang_op($number) {
  return pow(10, (strlen(strstr($number, '.')))); //Hvis man undlader -1
}

og laver produktet sådan virker det:

$produkt = ($faktor * $tal)/10;

mens dette ikke virker:

$produkt = ($faktor/10) * $tal;

Altså mærkeligt..
Avatar billede acid-head Nybegynder
06. april 2005 - 16:50 #16
Det er selvfølgelig ikke en holdbar løsning, men det er da mærkeligt..
Avatar billede acid-head Nybegynder
06. april 2005 - 17:11 #17
Eller dvs. det virkede kun for 0.57.. Tallet 0.5751 giver fx stadig fejl..
Avatar billede bojo Nybegynder
06. april 2005 - 18:20 #18
(int) typecaster til heltal ved bare at droppe decimaldelen, brug ciel(), floor(), round() eller (int)($tal*100)/100
Avatar billede Slettet bruger
06. april 2005 - 18:35 #19
I know, men det burde da ikke have effekt når tallet er float 57
Avatar billede bojo Nybegynder
06. april 2005 - 19:59 #20
Faktisk ret Interessant, men et kendt problem viser det sig, http://dk2.php.net/manual/da/language.types.float.php mere spændende læsning om emnet på http://www.randelshofer.ch/fhw/gri/float.html
Avatar billede acid-head Nybegynder
07. april 2005 - 15:22 #21
Jeg har prøvet med round(), floor() og de andre forslag, men det løser ikke mit problem.. Jeg kan ikke gennemskue hvordan jeg løser dette.. :(
Avatar billede acid-head Nybegynder
07. april 2005 - 15:29 #22
Joh, det virkede sQ alligevel med round().

Mange tak for løsningen bojo.. Hvis du smider et svar, så skal du få pointene..
Hvis du gerne vil have nogle også Gartzen, så kan du også smide et svar ;)
Avatar billede bojo Nybegynder
07. april 2005 - 15:32 #23
dette er jo ikke en løsning, men en omgåelse af en fejl i PHP

<?
function gang_op($tal)
{
  $ti = 1;
  $q = strlen(strstr($tal,'.'))-1;
  for($i=0;$i<$q;$i++)
    $ti=$ti*10;

  return $ti;
}

$tal = 0.57;

//Her returnerer gang_op 100, og $ny_tal bliver 57
$ny_tal = gang_op($tal)*$tal;

$ny_tal=substr($ny_tal,0,strlen($ny_tal));
//Denne viser 57
echo (int)$ny_tal."<br>";;

//Denne viser 57
echo $ny_tal."<br>";;
?>
Avatar billede acid-head Nybegynder
07. april 2005 - 16:25 #24
Det er da en løsning på mit problem ;)

Skal jeg så bruge
  $ny_tal=substr($ny_tal,0,strlen($ny_tal));
eller
  echo (int)round($ny_tal)."<br>";

da begge to virker..?
Avatar billede bojo Nybegynder
07. april 2005 - 16:30 #25
jeg ville så bruge (int)round($ny_tal), men det er vel nærmest en smagssag

Nej tak, svar selv og husk at acceptere svaret ;-)
Avatar billede acid-head Nybegynder
07. april 2005 - 16:37 #26
Okay.. Men i hvert fald tak for hjælpen, anyways :)
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