Avatar billede totalpc Seniormester
18. marts 2022 - 19:18 Der er 7 kommentarer og
1 løsning

Afrund procent så det går op i 100%

tal1 = 34
tal2 = 21
ialt 55

Det omregner jeg til procent
tal1 = (35*100)/55
tal2 = (21*100)/55

tal1 = 61,8181818 %
tal2 = 38,1818182%

Nu vil jeg gerne præsenteret 2 pæne tal i procent som giver 100% til sammen. Det kan jeg sgutte finde ud af. Uanset hvordan jeg runder op/ned så går det ikke op. Det skal selvfølgelig passe i alle henseender. Det har en af jer garanteret løst før :)


Jeg har 2 decimal værdier jeg skal skrive om til procent.
Det får jeg 2 værdier ud af som ikke giver 100% til sammen. Det
Avatar billede arne_v Ekspert
18. marts 2022 - 19:33 #1

<?php
$tal1 = 34;
$tal2 = 21;
$tal1pct = round(100 * $tal1 / ($tal1 + $tal2));
$tal2pct = round(100 * $tal2 / ($tal1 + $tal2));
echo "$tal1pct $tal2pct\r\n";
$tal1pct = round(100 * $tal1 / ($tal1 + $tal2), 1);
$tal2pct = round(100 * $tal2 / ($tal1 + $tal2), 1);
echo "$tal1pct $tal2pct\r\n";
?>


udskriver:

62 38
61.8 38.2

Men metoden garanterer ikke sum 100% ved mere end 2 tal.
Avatar billede arne_v Ekspert
18. marts 2022 - 19:35 #2
Faktisk heller ikke ved 2.
Avatar billede arne_v Ekspert
18. marts 2022 - 19:42 #3

<?php
$tal1 = 455;
$tal2 = 545;
$tal1pct = round(100 * $tal1 / ($tal1 + $tal2));
$tal2pct = round(100 * $tal2 / ($tal1 + $tal2));
echo "$tal1pct $tal2pct\r\n";
?>


giver:

46 55

Så:


<?php
$tal1 = 455;
$tal2 = 545;
$tal1pct = round(100 * $tal1 / ($tal1 + $tal2));
$tal2pct = 100 - $tal1pct;
echo "$tal1pct $tal2pct\r\n";
?>
Avatar billede claes57 Ekspert
18. marts 2022 - 19:46 #4
hvis man har 3 tal, der alle slutter på ,33 - hvilket skal så afrundes til +1
hvis man har 2 tal, der slutter på ,50 - hvilket skal så afrundes til +1
Avatar billede arne_v Ekspert
18. marts 2022 - 19:57 #5
#4

Ja.

Formentligt er det bedre bare at lave en round og leve med en lille forskel mellem sum og 100.

Men ellers skal et af tallene beregnes som 100 minus summen af de andre tal.
Avatar billede totalpc Seniormester
18. marts 2022 - 20:33 #6
https://revs.runtime-revolution.com/getting-100-with-rounded-percentages-273ffa70252b

Jeg danset ovenstående som måske kan bruges som “algoritme” men jeg kan ikke omskrive det.
Avatar billede totalpc Seniormester
18. marts 2022 - 20:34 #7
Haha jeg har selvfølgelig ikke danset, men fundet.
Avatar billede arne_v Ekspert
19. marts 2022 - 00:56 #8
Det er ikke helt nemt, men her er mit bud:


<?php
function pctify($a, $dig = 0) {
    $total = array_sum($a);
    $scale = pow(10.0, $dig);
    $unadj = array_map(function($v) use($total) { return 100.0 * $v / $total; }, $a);
    $trunc = array_map(function($v) use($scale, $dig) { return floor($scale * $v) / $scale; }, $unadj);
    $diff = array();
    for($i = 0; $i < count($a); $i++) $diff[$i] = array('ix' => $i, 'diff' => $unadj[$i] - $trunc[$i]);
    usort($diff, function($v1,$v2) { return $v2['diff'] > $v1['diff'] ? 1 : -1; });
    $adj = $trunc;
    $nadj = round($scale * (100.0 - array_sum($trunc)), 0);
    for($i = 0; $i < $nadj; $i++) $adj[$diff[$i]['ix']] += 1 / $scale;
    return $adj;
}


$a = array(333, 334, 333);
$pcta = pctify($a, 0);
echo implode(' ', $pcta) . "\r\n";
$pcta = pctify($a, 1);
echo implode(' ', $pcta) . "\r\n";
$b = array(4555, 5445);
$pctb = pctify($b, 1);
echo implode(' ', $pctb) . "\r\n";
$pctb = pctify($b, 2);
echo implode(' ', $pctb) . "\r\n";
$c = array(33333, 33334, 33333);
$pctc = pctify($c, 1);
echo implode(' ', $pctc) . "\r\n";
$pctc = pctify($c, 2);
echo implode(' ', $pctc) . "\r\n";
?>
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

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