Проблемы с точностью округления

Духовность™

Продвинутый новичок
Проблемы с точностью округления

Что-то туплю... Есть функция вычисления процента:

PHP:
function pl_percent($i, $sum)
{
	return round(($i/$sum)*100);
}
результаты выводятся примерно такие:

38%
31%
15%
15%

ceil и floor, поставленные вместо round, тоже выводят цифры с соответствующими погрешностями.

Скажите, в чем я не прав?
 

Tuman

Новичок
Re: Проблемы с точностью округления

Хотя бы примеры привели.
Я не вижу, где тут погрешность.
Автор оригинала: triumvirat
38%
31%
15%
15%
А если в целом, есть такая вещь - поиск. "Погрешность при работе с числами с плавающей запятой" ответ даст точно.
 

Tuman

Новичок
Первый же: _http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments

-~{}~ 07.08.08 11:49:

PHP:
function pl_percent($i, $sum)
{
    return round(($i/$sum)*100);
}

echo pl_percent(7, 25) . '<br>';
echo pl_percent(9, 25) . '<br>';
echo pl_percent(15, 25) . '<br>';
echo pl_percent(7, 40) . '<br>';
echo pl_percent(4, 50) . '<br>';

/*
28
36
60
18
8
*/
28 + 36 + 60 + 18 + 8 != 100

P.S. Я конечно догодался, что вы хотите вычислить % каждой из составных частей от их суммы (100%). Но, это ж догадываться надо, и по мне, для этой цели есть функция поинтереснее.
 

Духовность™

Продвинутый новичок
Tuman
echo pl_percent(7, 25) . '<br>';
echo pl_percent(9, 25) . '<br>';
echo pl_percent(15, 25) . '<br>';
echo pl_percent(7, 40) . '<br>';
echo pl_percent(4, 50) . '<br>';
это что такое?

В функцию передается два аргумента - общее количество (второй аргумент) и количество частного, процент которого от 100% надо узнать.

-~{}~ 07.08.08 12:06:

Вообще, есть у кого готовое решение? А то очень срочно надо..
 

Tuman

Новичок
Если честно, я не знаю, что вы там вычисляете, у меня были такие проблемы при более глубокой работе. Какой тип приходит?

PHP:
function pl_percent($i, $sum)
{
    return round(($i/$sum)*100);
}

$res[] = pl_percent(7.3, 25);
$res[] = pl_percent(9.25, 25);
$res[] = pl_percent(8.45, 25);

echo array_sum ($res);

// 100
 

SiMM

Новичок
> 38+31+15+15 = 99
> должно быть 100
С какой это кстати?
По Вашему получается, что 33.(3), умноженное на 3 после округления до целых, должно давать 100?
 

dimagolov

Новичок
triumvirat, все умные округляют как нравиться N-1 процент, а последний (его можно выбирать как макс. значения для минимизации погрешности) получают отнимая от 100 сумму остальных процентов.

ну а остальные пытаются добиться равенства суммы округлений и округления суммы, что нереально в принципе. особо смешно это когда суммы в тысячах хотят подбить в итоговой таблице (типа помесячно и по разделу до рубля, а потом суммы по разделам и за год до тысяч, а общая сумма - разная. парадокс, блин :)

-~{}~ 07.08.08 09:19:

да, в excel есть правильное решение - отображают с заданной точностью, а считают с максимальной. но тоже не всегда спасает от "а давайте проверим этот компьютер на калькуляторе"

-~{}~ 07.08.08 09:21:

SiMM, round (33.(3) * 3) == 100 :D. блин, не сразу понял, что имел ты в виду round(33.(3)) * 3 ;)
 
Сверху