ситуация такая, есть переменная $a=24.1236666 как ее округлить максимально точно с точностью до второго знака? метод round($a)*100/100 не подойдет так как он очень не точно округляет, смысл какой, у меня есть несколько пользоваетлей у которых в БД есть ячейка в которую пишется их процент(не важно чего) при изменении процента одного меняется процент всех других тобишь было 1=>25 2=>25 3=>25 4=>25 потом у первого стало 1=>16 следовательно 2=>28 3=>28 4=>28 так вот способ round($a)*100/100 не прокатывает так как после изменения 25 например на 21,22 погрешность может составлять 2 процента, а мне нужна точность до второго знака. Всем заранее спасибо.
В общем еще больше погрешность теперь вот код: Код (Text): $newPercent = $_GET['val']; //Новый процент $res = mysql_query("SELECT * FROM `default`"); $allMoney = (float)mysql_result($res, 0, 'money'); //Весь капитал $res = mysql_query("SELECT * FROM `clients` WHERE `id`='$id'"); $currPercent = mysql_result($res, 0, 'percent'); //Текщий процент клиента $currMoneyUser = $allMoney*$currPercent/100; //Текущий баланс клиента if($currPercent > $newPercent){ //при снятии денег $diffSumm = $allMoney*($currPercent-$newPercent)/100; //сумма к снятию $newCapital = $allMoney-$diffSumm; //измененный капитал $res = mysql_query("SELECT * FROM `clients`"); for($i=0;$i<mysql_num_rows($res);$i++){ $f = mysql_fetch_assoc($res); if($f['id'] != $id){ $currInvest = $allMoney*$f['percent']/100; $newPercentUser = $currInvest*100/$newCapital; $query = "UPDATE `clients` SET `percent`='$newPercentUser' WHERE `id`='".$f['id']."'"; mysql_query($query) or die("Ошибка:".mysql_error()); } } mysql_query("UPDATE `clients` SET `percent`='$newPercent' WHERE `id`='$id'") or die("Ошибка:".mysql_error()); } и например при изменении процента первого с 25 на 16 погрешность составляет 2 процента
извечная проблема округления при расчетах бабла. делают так. считают все изменения без одного, а потом от общего кол-ва отнимают сумму и впаривают последнему.
так у меня в БД хранится не сумма бабла а процент от общего капитала, а общий капитал это сумма крупная и целая.
смысла не вижу например сумму в 25000 хранить в копейках, если один хрен при 2500000/100 = 25000.00 и при float(25000) = 25000.00. это решение помогло бы если я сумму каждого хранил в копейках так как они были бы в виде 1023,25252525 в бд если в рублях
флоппик не катит, тоже самое то есть из 25 //первый 25 //второй 25 //третий 25 //четвертый 0 //погрешность при изменении: 16 //первый 27.47 //второй 27.47 //третий 27.47 //четвертый 1.59 //погрешность я думаю просто тупо сделать еще один цикл который будет среднее арифметической от погрешности плюсовать всем кроме изменяемого, но такой метод катит только при изменении процента к нулю а от нуля нет, так как есть возможность уйти в минус по процентам, так что по сути это не выход
Device Тут уже не раз обсуждали почему деньги нельзя хранить в float и double, поиском можно воспользоваться. Кратко: это неточное число. Т.е. float хранит не то значение, которое в него пишут, а примерное, приблизительное. Поэтому деньги хранят либо строкой (decimal) либо целым числом (int, bigint) с нужной точностью.
при любых операциях деления в бабле есть погрешность. посему я бы завел еще один аккаунт и погрешность писал бы туда. тогда в сумме все было бы по нулям и общая сумма была бы всегда 100. p.s. Базилио, 5 на 2 не делиться? Получи свой золотой. гыгыгы