PC
Cálculo juros compostos
Boa tarde Devs, fiz uma função para cálculos de juros compostos e armazenar em um TEntry não editável.
Coloco o valor atraso = 100,00 automaticamente no campo Taxa = 2,00 e no campo Juros = 4,06. Ao fazer a soma do Valor Atualizado = 106,00. Mas o correto é 106,06.
public static function onTaxa($param)
{
$valor_atraso = (double) str_replace(['.', ','], ['', '.'], $param['valor_atraso']);
//$valor_atualizado = (double) str_replace(['.', ','], ['', '.'], $param['valor_atualizado']);
$tempo = 4;
$object = new StdClass;
$object->taxa = number_format( ($valor_atraso * 0.02), 2, ',', '.');
$object->juros = number_format( ($valor_atraso * pow(1+(0.01), $tempo)-$valor_atraso), 2, ',', '.');
$object->valor_atualizado = number_format( ($valor_atraso + $object->taxa + $object->juros), 2, ',', '.');
TForm::sendData('form_Divida', $object);
}
public static function onExitAction($param)
{
$obj = new StdClass;
$obj->taxa = $param['valor_atraso'];
TForm::sendData('form_Divida', $obj);
//new TMessage('info', ' Multa de Atraso 2% ' . $param['taxa']);
}
Coloco o valor atraso = 100,00 automaticamente no campo Taxa = 2,00 e no campo Juros = 4,06. Ao fazer a soma do Valor Atualizado = 106,00. Mas o correto é 106,06.
public static function onTaxa($param)
{
$valor_atraso = (double) str_replace(['.', ','], ['', '.'], $param['valor_atraso']);
//$valor_atualizado = (double) str_replace(['.', ','], ['', '.'], $param['valor_atualizado']);
$tempo = 4;
$object = new StdClass;
$object->taxa = number_format( ($valor_atraso * 0.02), 2, ',', '.');
$object->juros = number_format( ($valor_atraso * pow(1+(0.01), $tempo)-$valor_atraso), 2, ',', '.');
$object->valor_atualizado = number_format( ($valor_atraso + $object->taxa + $object->juros), 2, ',', '.');
TForm::sendData('form_Divida', $object);
}
public static function onExitAction($param)
{
$obj = new StdClass;
$obj->taxa = $param['valor_atraso'];
TForm::sendData('form_Divida', $obj);
//new TMessage('info', ' Multa de Atraso 2% ' . $param['taxa']);
}
Boa tarde.
Tente fazer o cálculo sem a coerção para double.
Você está usando os valores formatados para fazer a soma, por isso ocorre o arredondamento. Use variáveis intermediárias para armazenar os valores.
//RESOLVIDO
public static function onTaxa($param)
{
$valor_atraso = $param['valor_atraso'];
$data_vencimento = $param['data_vencimento'];
$object = new StdClass;
$data_servidor = new DateTime('now');
$data_vencimento = new DateTime($data_vencimento);
$tempo = $data_servidor->diff($data_vencimento);
$tempo->m;
$object->taxa = number_format($valor_atraso * (2/100), 2, '.', '');
$object->juros = ($valor_atraso * pow(1+1/100, $tempo->m) - $valor_atraso);
$object->juros = number_format($object->juros, 2, '.', '');
$object->valor_atualizado = number_format($valor_atraso + $object->taxa + $object->juros, 2, '.', '');
TForm::sendData('form_Divida', $object);
}
public static function onExitAction($param)
{
$obj = new StdClass;
$obj->taxa = $param['taxa'];
//$obj->data_vencimento = $param['data_vencimento'];
TForm::sendData('form_Divida', $obj);
}