Funcao Truncar ou arredondar



  • Alguem pode me ajudar a me informar onde esta o erro desta função que desenvolvi e coloquei no maker

    parametros inteiro, numero, inteiro

    function arredtrunca(tpcalc, value, decimalQtt) {
    //Calcula o factor
    var factor = Math.pow(10, parseNumeric(decimalQtt));
    value = parseNumeric(value);


    // 0 arredonda, 1 trunca

    if (tpcalc == 0) {

    // Multiplica pelo fator
    value *= factor;
    // Arredonda o valor
    value = Math.round(value);
    // Divide pelo fator
    value /= factor;
    return value;

    } else if (tpcalc == 1) {

    int var1 = (int) value; // Remove a parte decimal do número... 2.3777 fica 2
    double var2 = var1 * factor; // adiciona zeros..2.0 fica 200.0

    var2 *= factor;
    var2 = Math.round(var2); //arredonda conserta numeros que nao podem ser representados na base binária
    var2 /= factor;

    /** Primeiro retira a parte decimal fazendo 2.3777 - 2 ..fica 0.3777,
    depois multiplica por 10^(casas decimais)
    por exemplo se o número de casas decimais que queres considerar for 2, então fica 0.3777*10^2 = 37.77 **/

    double var3 = (value - var1) * factor; // Remove a parte decimal da var3, ficando 37
    int var4 = (int) var3; // Só para não haver erros de precisão: 200.0 passa a 200
    int var5 = (int) var2; // O resultado será 200+37 = 237
    int resultado = var5 + var4; // Finalmente divide-se o resultado pelo número de casas decimais, 237/100 = 2.37
    double resultado_final = resultado / factor; // Retorna o resultado_final

    return resultado_final;

    }

    }


  • Já existem funções de "Truncar", "Arredondar casas decimais", etc.
    Porque não usa elas?


  • simples, porque as funçoes que existem não me atendem, elas não são inteligente e são extramamente limitadas.

    EX: a função truncar simplesmente ELIMINA as casas decimais, e eu preciso das casas decimais hora com 2 casas e hora com 4 casas.

    a mesma coisa acontece com as funções arredondar disponíveis....

    por isso desenvolvi esta função, mas acontece um erro que não consigo descobrir... pois não sou expert em java, por isso preciso de ajuda


  • Porque você não cria sua lógica então em um fluxo e faz dele a sua função ?


  • Ok!

    Através de um fluxo funcionou.

    Agora eu consigo chamar esta função em uma consulta. atrav''es da função "abrir consulta" ?

    At
    Eduardo


  • Você tem 2 alternativas (que passou pela minha cabeca):

    1) Tratar o dado utilizando funções do proprio banco (Na propria consulta, fazer o select... trunc(campo, 2)) ou seja lá qual for a função (varia de banco para banco, é claro).
    2) Tratar o dado depois da consulta (Por exemplo, quando você for utilizar o dado que seja fazer o truncar ou arredondar, você repassa o valor do campo para o seu fluxo e retorna o valor tratado para uma variável sua)


  • Cara, agora vc chegou onde eu queria.... o meu problema está ai.

    Eu uso a 1ª alternativa, ou seja eu trato por funções de banco. No SQL funciona 100%, quando eu vou para o postgre dá erro.

    A minha consulta tem que parametrizada tipo: select trunc(campo,:par_decimais) ..... onde o campo é o campo mesmo da tabela e par_decimais é um parâmetro que é passado... no postgre nao aceita dá erro.... e eu preciso disso pois o parametro é informado pelo usuário no momento da análise.
    vou mais longe....

    Qdo está no MSSQL eu passo ainda o parâmetro de truncar ou arredondar, para o postgre eu criei uma função no banco.... mas qdo eu chamo uma procedure ou função que possui alguns parâmetros ocorre erro, informa que que a função nao existe, qdo troco os parametros para valores funciona!!!... esse é o meu problema.. por isso essa novela toda.

    E não dá para tratar fora da consulta... são milhares de registros.

    só para vc ter uma idéia.. quando se varia as casas decimais , juntamente com truncar ou arredondar, o valor a ser analizado sofre uma variação de mais de R$ 1.000.000 de reais, ou seja é muito importante esta função funcionar 100% com performance...

    No SQL funciona 100% o foda é que o danado do cliente, solicitou que mudasse para postgree por serr gratis.... e o cliente é governo.....


  • [quote="efreitas"]Cara, agora vc chegou onde eu queria.... o meu problema está ai.

    Eu uso a 1ª alternativa, ou seja eu trato por funções de banco. No SQL funciona 100%, quando eu vou para o postgre dá erro.

    A minha consulta tem que parametrizada tipo: select trunc(campo,:par_decimais) ..... onde o campo é o campo mesmo da tabela e par_decimais é um parâmetro que é passado... no postgre nao aceita dá erro.... e eu preciso disso pois o parametro é informado pelo usuário no momento da análise.
    vou mais longe....[/quote]


  • [quote="efreitas"]Cara, agora vc chegou onde eu queria.... o meu problema está ai.

    Eu uso a 1ª alternativa, ou seja eu trato por funções de banco. No SQL funciona 100%, quando eu vou para o postgre dá erro.

    A minha consulta tem que parametrizada tipo: select trunc(campo,:par_decimais) ..... onde o campo é o campo mesmo da tabela e par_decimais é um parâmetro que é passado... no postgre nao aceita dá erro.... e eu preciso disso pois o parametro é informado pelo usuário no momento da análise.
    vou mais longe....[/quote] Era para funcionar o parametro normalmente... não sei qual é o seu problema especificamente

    Pra resolver rapidamente, porque voce nao faz um simples "Abrir consulta dinamica" onde você monta sua consulta (Select) em forma de texto ? Dai você concatena o select com a variável que contem o valor dos decimais que vocÊ deseja...
    Seria:

    Abrir Consulta Dinamica(concatenar("select trunc(campo, ", "2", ")")

    Onde 2, seria igual a sua variável.

    Você ja perdeu muito tempo com essa bobagem ! hehehe

Log in to reply