round не правильно округляет

alexhemp

Новичок
Обратиться к бухгалтеру с этим вопросом.

Математическое понятие "округление" и правильное вычисление НДС - вопросы разные.

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

Lazarius

Новичок
Ох ты ё моё :)
пойду спрошу у яндекса про фин. математику
блин даже не подозревал о существовании такой :))

-~{}~ 19.04.06 15:53:

Мда.. финансовое и банковское это одно и то же...

но применяется оно, как я понял, только если после разряда, до которого округляешь, стоит 5

Так что вообщем то проблема не решена...

А бухгалтер заладила: я не знаю, но чтобы было правильно и хоть ты тресни
 

rob72

Новичок
Начали с того, что round неправильно округляет, а тут вона чего нужно, денежные суммы складывать.
Может попробовать для сложения использовать это вместо '+'
PHP:
<?php 
	function fin_add($a,$b){
//--Рубли-отдельно, копейки-отдельно--
$a_rub=floor($a);
$a_cop=($a-$a_rub);
$b_rub=floor($b);
$b_cop=($b-$b_rub);
//--Складываем копейки--
$cy=0;//Перенос--
$r_cop=$a_cop+$b_cop;
if($r_cop>=100){
$r_cop-=100;
$cy=1;
}
//--Складываем рубли--
$r_rub=$a_rub+$b_rub+$cy;
//--Результат в рублях (дробь)--
return ($r_rub+$r_cop);
}//End_func
//--ТЕСТ--
$a_arr=array(100.5,210.25,333.25,200,888.5);
$b_arr=array(50.5,310.25,883.65,252.87,444.8);
while($a=current($a_arr)){
$b=current($b_arr);
printf("%s+%s=%s\n",$a,$b,fin_add($a,$b));
next($a_arr);
next($b_arr);
}
/*
100.5+50.5=151
210.25+310.25=520.5
333.25+883.65=1216.9
200+252.87=452.87
888.5+444.8=1333.3
*/
?>
 

Lazarius

Новичок
Автор оригинала: rob72
Начали с того, что round неправильно округляет, а тут вона чего нужно, денежные суммы складывать.
Может попробовать для сложения использовать это вместо '+'
PHP:
<?php 
	function fin_add($a,$b){
//--Рубли-отдельно, копейки-отдельно--
$a_rub=floor($a);
$a_cop=($a-$a_rub);
$b_rub=floor($b);
$b_cop=($b-$b_rub);
//--Складываем копейки--
$cy=0;//Перенос--
$r_cop=$a_cop+$b_cop;
if($r_cop>=100){
$r_cop-=100;
$cy=1;
}
//--Складываем рубли--
$r_rub=$a_rub+$b_rub+$cy;
//--Результат в рублях (дробь)--
return ($r_rub+$r_cop);
}//End_func
//--ТЕСТ--
$a_arr=array(100.5,210.25,333.25,200,888.5);
$b_arr=array(50.5,310.25,883.65,252.87,444.8);
while($a=current($a_arr)){
$b=current($b_arr);
printf("%s+%s=%s\n",$a,$b,fin_add($a,$b));
next($a_arr);
next($b_arr);
}
/*
100.5+50.5=151
210.25+310.25=520.5
333.25+883.65=1216.9
200+252.87=452.87
888.5+444.8=1333.3
*/
?>
Спасибо конечно, но помоему Вы не очень правильно поняли проблему, дело там всё таки в округлении.
Попробовал тоже самое в 1С и выпал в осадок, увидев такие же цифры :eek:
В конце концов выяснилось, что у всех такая проблема, а налоговая инспекция просто забила давным давно на это.
 
Сверху