Como utilizar a classe BigDecimal?



  • Pessoal, criei uma função de dividir onde envio por parâmetro dois valores, converto para BigDecimal e retorno a divisão.

    Acontece que está dando erro quando entro no sistema, alguém poderia dizer o porque? É a primeira função que criei no Maker, não consegui achar o porque do erro.
    [code]protected final Variant osDividir(Variant variant1, Variant variant2) throws Exception{ if(variant2.getDouble().doubleValue() == 0) throw new WFRRuleException("Divisão por 0 (zero) não é permitido!", this.ruleName); java.math.BigDecimal v1 = new java.math.BigDecimal(variant1.getDouble()); java.math.BigDecimal v2 = new java.math.BigDecimal(variant2.getDouble()); return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64)).doubleValue(); }[/code]


  • Qual o erro? Anexe a pilha do erro.


  • Quando entro no sistema aparece a janela de erro com a seguinte mensagem:

    Erro de compilação # WebrunFunctions # Consulte o log da aplicação!

    A exceção gerada é a seguinte:

    Exceção Gerada:
    wfr.exceptions.WFRCompileException: java.lang.Exception: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java:15715: cannot find symbol symbol : method doubleValue() location: class wfr.rules.Variant return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64)).doubleValue(); ^ Note: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 error at wfr.util.Functions.compileFile(Functions.java:3648) at wfr.util.Functions.compileFile(Functions.java:3604) at
    ...
    ...

    Causa:
    java.lang.Exception: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java:15715: cannot find symbol symbol : method doubleValue() location: class wfr.rules.Variant return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64)).doubleValue(); ^ Note: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: C:\Program Files\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun2_7_0_44/src/wfr/com/systems/system_sac/rules/WebrunFunctions.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 error at wfr.util.Functions.compileFile(Functions.java:3640) at wfr.util.Functions.compileFile(Functions.java:3604) at
    ...
    ...


  • O problema está nesta linha.
    [code]return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64)).doubleValue();[/code]
    Não existe o método "doubleValue" no VariantPool.get

    Experimente [code]return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64));[/code]


  • Eu corrigi, tinha fechado o parenteses errado. É uma função do objeto BigDecimal.
    [code]return VariantPool.get(v1.divide(v2, java.math.MathContext.DECIMAL64).doubleValue());[/code]


  • Beleza. Funcionou certinho agora?


  • Sim sim, redondinho. Agora sim consigo ter precisão nas minhas contas! rs


  • Ronélio,

    O trecho abaixo é o retorno da função: [code]return VariantPool.get(v1.add(v2));[/code] Como o webrun interpreta que esse retorno é uma String, Double, Boolean...?


  • Então, ali vc está retornando Variant.
    Ao atribuir a uma variável do tipo Double, ele assumirá double.

    Veja este link onde mostra como retornar os tipos desejados.


    http://suporte.softwell.com.br/maker/manual2_7/pt/dicas_e_truques/funcoes/exemplo_de_como_criar_uma_funcao.htm


  • Na prática, o Webrun não precisa conhecer nenhum tipo de dado.
    O webrun conhece o tipo de dado Variant, que possui alguns construtores conhecidos (String, Double, Date, etc).
    Os tipos que o Webrun não conhece, ele armazena como Object mesmo. Acontece que a manipulação de dados desconhecidos é sempre feito por funções que você cria... :)

Log in to reply