Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 18-11-2020 em todas as áreas
-
Olá Pessoal, Existem alguns provedores que permitem informar uma lista de Itens. São eles: SimplISS, esse provedor "segue" a versão 1 do layout da ABRASF. Elotech e FintelISS, esses 2 provedores "seguem" a versão 2 do layout da ABRASF. Agiliv1, Agiliv2, AssessorPublico, EL, Equiplano, Governa, Infisc, IPM, ISSDSF, Siat e SmarAPD, todos esses provedores possuem um layout próprio.5 pontos
-
Comunicado SEFAZ/MG "Atualização das cadeias de certificado BP-e e NFC-e. 16/11/2020 Informamos que no dia 18/11/2020, às 09:00h, serão atualizadas as cadeias de certificado de produção dos documentos eletrônicos BP-e e NFC-e. As novas cadeias dos certificados da SEF foram disponibilizadas neste portal, na aba do respectivo documento, opção "Download." Fonte: http://www.sped.fazenda.mg.gov.br/spedmg/noticias/atualizacao-cadeias-de-certificado/ Download da nova cadeia: http://www.sped.fazenda.mg.gov.br/spedmg/nfce/Downloads/4 pontos
-
Olá Pessoal, Existem alguns provedores que permitem informar uma lista contendo as datas de vencimento e os valores de cada parcela. São eles: Betha e Publica, esses 2 provedores "seguem" a versão 1 do layout da ABRASF. Infisc, IPM e SmarAPD, esses 3 provedores possuem um layout próprio.3 pontos
-
Olá pessoal, O MDF-e tem uma particularidade em relação aos demais DF-e. Não importa em qual UF se encontra o contribuinte, todos os MDF-e de todos os contribuintes são recepcionados pela SVRS - SEFAZ-Virtual do Rio Grande do Sul e não existe um SVC - SEFAZ-Virtual de Contingência para o MDF-e. Como é que fica se a SVRS estiver parada? Conforme consta no Manual do MDF-e Visão Geral versão 3.00 - item 12 páginas 99, 100 e 101 a solução é emitir o MDF-e em contingência offline. Ações para a emissão em Contingência offline: Configurar o componente -> Configuracoes.Geral.FormaEmissao = teContingencia; Se você utiliza componente nativo para Delphi a propriedade é: ACBrMDFe.Configuracoes.Geral.FormaEmissao := teContingencia; Se você usa Lib, vai utilizar o método MDFe_ConfigGravarValor para definir a FormaEmissao nas configurações: MDFE_ConfigGravarValor("MDFe", "FormaEmissao", 1); Caso utilize ACBrMonitorPLUS, é o comando MDFe.SetFormaEmissao: MDFe.SetFormaEmissao(2) Alimentar o componente alterando o valor de tpEmis para teContingencia; Se você utiliza o componente nativo para Delphi/Lazarus: ACBrMDFe.Manifestos[0].Ide.tpEmis := teContingencia; Se você utiliza Lib ou Monitor, no arquivo INI que usa para gerar o MDFe: [ide] tpEmis=2 Executar os métodos Assinar e Validar da solução respectiva que estiver usando; Imprimir o DAMDFE usando o comando correspondente na solução respectiva que estiver usando. Quando a SEFAZ-Virtual do RS voltar os passos são: Configurar o componente -> Configuracoes.Geral.FormaEmissao = teNormal; Se você utiliza componente nativo para Delphi a propriedade é: ACBrMDFe.Configuracoes.Geral.FormaEmissao := teNormal; Se você usa Lib, vai utilizar o método MDFe_ConfigGravarValor para definir a FormaEmissao nas configurações: MDFE_ConfigGravarValor("MDFe", "FormaEmissao", 0); Caso utilize ACBrMonitorPLUS, é o comando MDFe.SetFormaEmissao: MDFe.SetFormaEmissao(1) Carregar o XML com o método LoadFromFile; Executar o método Enviar; Imprimir o DAMDFE. Tomem cuidado com o prazo, pois um MDF-e emitido em Contingência deve ser enviado para a SEFAZ para ser autorizado dentro do prazo de 168 horas contados a partir da data/hora de emissão (dhEmi) que consta no XML do mesmo. Alerta: Não altere o XML gerado em contingência quando for transmitir.3 pontos
-
UIA !!!!! RAPAIZ !!! Resolveu meu problema !!! tenho vários clientes que só usam POS, valeu Daniel, muito bom !!! Obrigado !!2 pontos
-
boa tarde tente aumentar o timeout verifique as configuracoes do certificado espero ter ajudado2 pontos
-
Esse arquivo não deve ter o nome do método novamente (NFE.CriarNFe(", pois já está chamando o método de Envio no botão. Este arquivo deve ter a estrutura de um .ini com as seções e tags apenas... Começando direto nela seção: [infNFe] versao=4.00 [Identificacao] ...1 ponto
-
Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Estranho pois pego ele e rodo e emito Boleto. creio que é por não ter visto as config nele1 ponto
-
Olá Juliomar! Obrigado pelo retorno. Infelizmente o demo está incompleto, graças a uma palestra gravada no youtube de um evento este ano do ACBr, consegui perceber que havia faltado informar o tipo de cobrança do banco (cobBancoDoBrasil). Após adicionar a alinha abaixo consegui gerar o boleto! ACBrBoleto1.Banco.TipoCobranca := cobBancoDoBrasil;1 ponto
-
Boa tarde Junior, Muito obrigado pela colaboração, vou incluir na minha lista de tarefas.1 ponto
-
Muito obrigado pela contribuição. Fiz a implementação baseada nela. Subi as alterações para o SVN na Revisão 2055. Pelo que vi está tudo certo. Queira por favor atualizar, testar e reportar qualquer problema. Mais uma vez obrigado.1 ponto
-
Muito obrigado pela contribuição. Fiz a implementação baseada nela. Subi as alterações para o SVN na Revisão 20952. Pelo que vi está tudo certo. Queira por favor atualizar, testar e reportar qualquer problema. Fiz a implementação baseada nela. Subi as alterações para o SVN na Revisão 20953. Pelo que vi está tudo certo. Queira por favor atualizar, testar e reportar qualquer problema. Mais uma vez obrigado.1 ponto
-
Sim . falei com o André Moraes e ele me explicou algumas coisas que depois vi estar no manual em homologação ele depois de alguns segundos aprova a venda pois é homologação em produção ele fica até 90 segundos esperando uma resposta do pagamento para prosseguir ou retorna erro e dai basta cancelar a transação1 ponto
-
Posto de combustível não pode usar NFC-e. Se tu tem Paf-ECF pode continuar igual se estiver homologado da versão 02.04 , 02.05 e 02.06 até sair a especificação de requisito e o equipamento daf. se tu tem paf-ecf e quer se incomodar um pouco pode usar a NFC-e lembrando que é como ele defini na especificação de requisitos e a contigência é em Paf-ECF E pode usar o Paf-NFCe com especificação de requisitos precária que tu tem que ter as opções e requisitos desse manual onde emite tanto online quanto offline a NFC-e massssss se tu não seguir o requisito ou eles forem fiscalizar e acharem que tu não está de acordo com o que eles pediram no manual tu pode ser altuado e seu cliente também e serão obrigados a voltar imediatamente ao Paf-ECF e arcar com multas, prisão etc. (penas da lei) se o seu cliente quiser bancar o esperto e usar seu Paf-NFCe para burlar algo ou eles também forem fiscalizar e notarem algo seu cliente será obrigado a voltar imediatamente ao Paf-ECF e sofrer multas, prisão etc(penas da lei) mas lembre tudo é interpretação do Fiscal que estiver lá e dos fiscais que irão analisar as informações. Paf-NFCe tem um menu fiscal e tem que gerar todos os arquivos necessários.1 ponto
-
ok, Italo assim que estiver no jeito te envio estou às voltas com falta de energia e a VM onde estava o Delphi Berlin não está abrindo...1 ponto
-
1 ponto
-
sim no caso essa nota tem um desconto, deu valor quebrado...vou tratar e deve resolver o problema...1 ponto
-
Perfeito, deu certo, marquei a opção ACBr_DFeComum e deu certo. Otimo dia a vocês!!! tamo junto.1 ponto
-
Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.1 ponto
-
Bom dia Ítalo. Já enviei o e-mail para a equipe de tributos da 4R. Estou no aguardo do retorno deles e posto aqui assim que receber a resposta.1 ponto
-
Me parece que está tentando instalar apenas o ACBrBoleto. Nesse caso marque também o pacote ACBr_DFeComum para instalação. Ou faça instalação completa.1 ponto
-
Estranho.. ele está tentando compilar o Package do ACBrBoleto, antes de compilar a ACBrDFeComum... Por favor tente marcar a opção, de remover, as versões anteriores do ACBr1 ponto
-
Seguem unit alteradas com comandos para gravar valores Hexadecimais e ASCII nas impressoras Zebra.. Criei 2 Procedures procedure ComandoGravaRFIDHexaDecimal(aValue:String); procedure ComandoGravaRFIDASCII( aValue:String ); Comandos tirados diretamente do manual ZPLII e testados em uma impressora Zebra ZD500R ACBrETQPpla.pasACBrETQEpl2.pasACBrETQClass.pasACBrETQ.pasACBrETQZplII.pas1 ponto
-
Olá, neste tópico vamos detalhar como deve ser feita a configuração da dll do SAT para cada Fabricante utilizando o componente ACBrSAT. Sabemos que o componente ACBrSAT é compatível com todos os equipamentos SAT do mercado. A configuração do componente ACBr para comunicação com o aparelho em sí, é bem simples... Mas cada fabricante pode ter suas particularidades, então a configuração pode NÃO ser única para todos os modelos. A configuração inicial do ACBr para comunicação com o aparelho SAT se resume em três parâmetros: Configuração do DLL do fabricante. (Path da dll do SAT para comunicação com o equipamento ) Modelo da DLL utilizada pelo Fabricante. (Pode ser StdCall ou Cdecl) Código da Página de Código utilizada pelo fabricante para conversão de caracteres. Com essas configurações já é possível inicializar a comunicação e realizar os primeiros testes de comunicação como: ConsultarSAT. Configurações para cada marca e suas particularidades: Elgin Linker I driver/lib: https://www.automacao.elgin.com.br/produtos/sat Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha as dlls de dependência junto a dllsat.dll Elgin Linker II e SMART driver/lib: https://github.com/ElginDeveloperCommunity/SAT/tree/master/Elgin/SMART SAT Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha as dlls de dependência junto a dllsat.dll Bematech driver/lib: https://github.com/ElginDeveloperCommunity/SAT/tree/master/Bematech/satGo Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha o arquivo bemasat.xml com a configuração da porta do SAT. BemaSAT32.dll e bemasat.xml DEVEM ESTAR NO MESMO DIRETÓRIO DO .EXE Tanca driver/lib: https://www.tanca.com.br/drivers.php?cat=24&sub=58 Modelo: StdCall PagDeCodigo: 65001 Obs: Sweda driver/lib: https://sweda.com.br/suporte/download/ Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha as dlls de dependência junto a SATDLL.dll Dimep driver/lib: https://www.dimep.com.br/downloads/ Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha dlls e arquivos .ini de dependência junto a SAT.dll Gertec driver/lib: https://www.gertec.com.br/suporte/download-center/ Modelo: Cdecl PagDeCodigo: 65001 Obs: Acompanha o arquivos .conf de dependência junto a GERSAT.dll A APLICAÇÃO DEVE SER EXECUTADO COM PERMISSÃO DE ADMINISTRADOR. Kryptus driver/lib: https://www.easysat.com.br/downloads/ Modelo: Cdecl PagDeCodigo: 65001 Obs: Nitere driver/lib: https://www.custom4u.it/ Modelo: StdCall PagDeCodigo: 65001 Obs: dllsat.dll DEVE ESTAR NO MESMO DIRETÓRIO DO .EXE Daruma driver/lib: http://www.desenvolvedoresdaruma.com.br/home/index.php Modelo: StdCall PagDeCodigo: 65001 Obs: ControlID driver/lib: https://www.controlid.com.br/automacao-comercial/satid/ Modelo: Cdecl PagDeCodigo: 65001 Obs: Jetway driver/lib: http://www.jetway.com.br/produtos-jetway/sat-js-1000-jetway/ Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha o arquivos .inf de dependência junto a SAT.dll CSDevice driver/lib: https://plataformacare.com.br/downloads/ Modelo: StdCall PagDeCodigo: 65001 Obs: Acompanha as dlls de dependência junto a satcare.dll Epson driver/lib: https://epson.com.br/peps-drivers-apis-sat Modelo: Cdecl PagDeCodigo: 65001 Obs: Acompanha o arquivos .conf de dependência junto a GERSAT.dll A APLICAÇÃO DEVE SER EXECUTADO COM PERMISSÃO DE ADMINISTRADOR.1 ponto
-
Bom dia, veja a configuração indicada nesse tópico:1 ponto
-
Eu já tinha visto esse tipico aqui no fórum. Assisti o vídeo do Bill no Youtube, mas me pareceu que ao final o que faltou foi justamente o que estou precisando, integrar ACBr ao PHP no linux sem modo gráfico. De toda forma, vou criar uma maquina virtual ubuntu e tentar o passo a passo que tem no github do Bill (https://github.com/billbarsch/acbrlibphp) qualquer avanço posto aqui. Obrigado, BigWings!!!1 ponto
-
Descobrir esta vindo certo do sitef é so mudar //QRCode.Encoding := qrUTF8NoBOM; QRCode.Encoding := qrUTF8BOM; esse monta o qrcode sem o ?1 ponto
-
1 ponto
-
Pessoal, A quem se interessar, seque abaixo função para realizar o arredondamento ABNT (Arredondamento utilizado no ECF) Escrevi na linguagem Harbour, mas, basta apenas trocar os comandos para converter para qualquer outra linguagem (Se precisarem de ajuda na conversão, é só postar aqui, que tentarei ajudar) FUNCTION Round_ABNT(nValor,nDecimais) LOCAL nRetorno:=nValor, cDecimais:=SubStr(Str(nValor),At('.',Str(nValor))+1), nSubsequente:=nDecimais+1 if nDecimais<1 RETURN Int(nRetorno) endif if Len(cDecimais) <= nDecimais RETURN nRetorno endif if SubStr(cDecimais,nSubsequente,1)>'5' .or. SubStr(cDecimais,nSubsequente,1)<'5' //Se a casa decimal SUBSEQUENTE for DIFERENTE de 5 nRetorno:=Round(nValor,nDecimais) //ARREDONDA elseif SubStr(cDecimais,nSubsequente,1)=='5' //Se a casa decimal SUBSEQUENTE for IGUAL a 5 if Mod(Val(SubStr(cDecimais,nDecimais,1)),2) <> 0 //Se a casa decimal que será CONSERVADA, for IMPAR nRetorno:=Round(nValor,nDecimais) //ARREDONDA else //se a casa decimal que será CONSERVADA, for PAR if Val(SubStr(cDecimais,nSubsequente+1,1)) > 0 //Se APÓS a casa decimal SUBSEQUENTE, houver ALGUM algarismo MAIOR que ZERO nRetorno:=Round(nValor,nDecimais) //ARREDONDA else //Se APÓS a casa decimal SUBSEQUENTE, não houver NENHUM outro algarismo ou TODOS forem iguais a ZERO nRetorno:=Truncate(nValor,nDecimais) //TRUNCA (Esse é o único momento em que o "arredondamento ABNT" se diferencia do "arredondamento normal") endif endif endif RETURN nRetorno FUNCTION Truncate(nValor,nDecimais) LOCAL nRetorno:=nValor, cDecimais:=SubStr(Str(nValor),At('.',Str(nValor))+1) if nDecimais<1 RETURN Int(nRetorno) endif if Len(cDecimais) <= nDecimais RETURN nRetorno endif nRetorno:=Val( Str(Int(nValor))+'.'+SubStr(cDecimais,1,nDecimais) ) RETURN nRetorno Nos vários testes que fiz aqui, funcionou muito bem, se encontrarem algum bug, favor, reportar aqui... Obrigado! Espero ter contribuído, Abraços, Reginaldo1 ponto
-
Para o pessoal que precisar fazer este arredondamento usando c#, segue o método, já com testes usando Xunit: using System; using Xunit; namespace XUnitTestProject1 { public class ArredondamentoTest { [Theory] [InlineData(0.342, 0.34)] [InlineData(0.346, 0.35)] [InlineData(0.3452, 0.35)] [InlineData(0.3450, 0.34)] [InlineData(0.332, 0.33)] [InlineData(0.336, 0.34)] [InlineData(0.3352, 0.34)] [InlineData(0.3350, 0.34)] [InlineData(0.3050, 0.30)] [InlineData(0.3150, 0.32)] public void TestRoundAbnt5891(decimal valorOriginal, decimal arredondadoEsperado) { decimal arredondadoMetodoABNT = RoundAbnt5891(valorOriginal, 2); Assert.Equal(arredondadoEsperado, arredondadoMetodoABNT); } /// <summary> /// Método de arredondamento "round-half-even" /// Ou "arredondamento do banqueiro" /// </summary> /// <param name="value"></param> /// <param name="digits"></param> /// <returns></returns> private decimal RoundAbnt5891(decimal value, int digits) { return Math.Round(value, digits, MidpointRounding.ToEven); } } }1 ponto
-
Uma coisa é a informação do CSOSN, outra é o grupo do XML em que ele deve ser criado. Basta olhar o manual, os CSOSN 102, 103, 300 e 400 devem ser informados no grupo ICMSSN102.1 ponto
-
Obrigado pela lógica pessoal. Segue o código em C++ #include<math.h> #include<iostream> double roundtoabnt(double value, int digits) { double potencia, valorElevado, restante; double parteInteira, parteFracionada, auxiliar; int ultimoDigitoMantido; potencia = pow(10, abs(digits)); valorElevado = value * (potencia); parteInteira = trunc(valorElevado); parteFracionada = trunc(modf(valorElevado, &auxiliar) * potencia); if (parteFracionada > 50) { parteInteira++; } else if (parteFracionada == 50) { ultimoDigitoMantido = round((modf(parteInteira / 10, &auxiliar)) * 10); if (ultimoDigitoMantido % 2) { parteInteira++; } else { restante = (modf(valorElevado * 10, &auxiliar)); } } return (parteInteira / potencia); }1 ponto
-
Nossa, Obrigado Datilas! como aqui usamos firebird 2.5, converti sua função em procedure, segue a contribuição tb: CREATE OR ALTER PROCEDURE SP_UDF_ROUNDABNT ( AVALOR DOUBLE PRECISION, ADECIMAIS SMALLINT) RETURNS ( VALOR DOUBLE PRECISION ) AS DECLARE VARIABLE CDECIMAIS VARCHAR(100); DECLARE VARIABLE VLRSTR VARCHAR(100); DECLARE VARIABLE NSUBSEQUENTE SMALLINT; DECLARE VARIABLE POSPONTO SMALLINT; BEGIN VLRSTR = CAST(AVALOR AS VARCHAR(100)); POSPONTO = POSITION('.',VLRSTR); CDECIMAIS = SUBSTRING(VLRSTR FROM POSPONTO+1 FOR CHAR_LENGTH(VLRSTR)); NSUBSEQUENTE = ADECIMAIS+1; IF (:ADECIMAIS < 1) THEN BEGIN VALOR = TRUNC(AVALOR); SUSPEND; exit; END ELSE IF (CHAR_LENGTH(CDECIMAIS) <= :ADECIMAIS) THEN BEGIN VALOR = AVALOR; SUSPEND; exit; END ELSE BEGIN IF ((CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1) AS INTEGER) > 5) OR (CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1)AS DOUBLE PRECISION) < 5)) THEN BEGIN VALOR = ROUND(AVALOR,ADECIMAIS); SUSPEND; exit; END ELSE IF (CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE FOR 1)AS DOUBLE PRECISION) = 5) THEN begin IF (MOD(CAST(SUBSTRING(CDECIMAIS FROM ADECIMAIS FOR 1)AS DOUBLE PRECISION) ,2) <> 0) THEN BEGIN VALOR = ROUND(AVALOR,ADECIMAIS); SUSPEND; exit; END ELSE IF (CAST(SUBSTRING(CDECIMAIS FROM NSUBSEQUENTE+1 FOR 1)AS DOUBLE PRECISION) > 0) THEN BEGIN VALOR = ROUND(AVALOR,ADECIMAIS); SUSPEND; exit; END ELSE begin VALOR = TRUNC(AVALOR,ADECIMAIS); SUSPEND; exit; END end END END Abraço!1 ponto
-
e aqui vai minha contribuição para o firebird 3.0 create or alter function ROUNDABNT ( AVALOR double precision, ADECIMAIS smallint) returns double precision AS declare variable cDecimais varchar(100); declare variable vlrstr varchar(100); declare variable nSubsequente smallint; declare variable posponto smallint; BEGIN vlrstr = Cast(AVALOR as varchar(100)); posponto = POSITION('.',vlrstr); cDecimais = SUBSTRING(vlrstr from posponto+1 for CHAR_LENGTH(vlrstr)); nSubsequente = ADECIMAIS+1; if (:ADECIMAIS < 1) Then RETURN TRUNC(AVALOR); else If (CHAR_LENGTH(cDecimais) <= :ADECIMAIS) Then RETURN AVALOR; else Begin If ((Cast(SUBSTRING(cDecimais from nSubsequente for 1) as integer) > 5) Or (Cast(SUBSTRING(cDecimais From nSubsequente For 1)as double precision) < 5)) Then RETURN ROUND(AVALOR,ADECIMAIS); Else if (Cast(SUBSTRING(cDecimais From nSubsequente For 1)as double precision) = 5) Then If (MOD(Cast(SUBSTRING(cDecimais From ADECIMAIS For 1)as double precision) ,2) <> 0) Then RETURN ROUND(AVALOR,ADECIMAIS); Else If (Cast(SUBSTRING(cDecimais From nSubsequente+1 For 1)as double precision) > 0) Then RETURN ROUND(AVALOR,ADECIMAIS); Else RETURN TRUNC(AVALOR,ADECIMAIS); End END1 ponto
-
Boa tarde! a primeira situação é que você não precisa ter duas pastas de fontes só por que usa o delphi e lazarus! sugiro a primeira situação deixar uma única! eu mesmo tenho lazarus, delphi 7, xe3, xe6, xe8 e seattle em uma único SVN! sobre o problema pode estar ligado a pasta onde já tinha algum arquivo antigo do synapse! então faça o seguinte exclua a pasta lib que foi criada no trunk e também se tiver no trunk2 ! depois faça um rebuild da ide dando um clean all em tudo!1 ponto
-
Pessoal, Precisei do código também para MySQL e fiz a conversão, então, segue abaixo: CREATE FUNCTION ROUND_ABNT(nValor real, nDecimais int) RETURNS real BEGIN DECLARE nRetorno real; DECLARE cDecimais char(100); DECLARE nSubsequente int; SET nRetorno = nValor; SET cDecimais = SUBSTRING(CONVERTE(nValor),INSTR(CONVERTE(nValor),'.')+1); SET nSubsequente = nDecimais+1; IF (nDecimais<1) THEN RETURN TRUNCATE(nRetorno,0); END IF; IF (LENGTH(cDecimais) <= nDecimais) THEN RETURN nRetorno; END IF; IF (SUBSTRING(cDecimais,nSubsequente,1)>'5' OR SUBSTRING(cDecimais,nSubsequente,1)<'5') THEN SET nRetorno = ROUND(nValor,nDecimais); ELSEIF (SUBSTRING(cDecimais,nSubsequente,1)='5') THEN IF (MOD(SUBSTRING(cDecimais,nDecimais,1),2) <> 0) THEN SET nRetorno = ROUND(nValor,nDecimais); ELSE IF (SUBSTRING(cDecimais,nSubsequente+1,1) > 0) THEN SET nRetorno = ROUND(nValor,nDecimais); ELSE SET nRetorno = TRUNCATE(nValor,nDecimais); END IF; END IF; END IF; RETURN nRetorno; END;1 ponto
-
Opa, muito obrigado pelo código base, man!! Me serviu muito, passei ele para JavaScript. Segue abaixo o que eu fiz, se alguém usar e encontrar algum bug, por favor, reporte para arrumar-mos! function round_abnt(nValor, nDecimais) { var nRetorno = nValor; spl = nValor.toString().split("."); var cDecimais = spl[1]; var nSubsequente = nDecimais; if (nDecimais < 1) { return parseInt(nRetorno); } if (cDecimais.length <= nDecimais) { return parseFloat(nRetorno); } //Se a casa decimal SUBSEQUENTE for DIFERENTE de 5 if (cDecimais.substr(nSubsequente,1) > '5' || cDecimais.substr(nSubsequente,1) < '5') { nRetorno = nRetorno.toFixed(2); //Math.round((nRetorno + 0.00001) * 100) / 100; //ARREDONDA } //Se a casa decimal SUBSEQUENTE for IGUAL a 5 else if (cDecimais.substr(nSubsequente, 1) == '5') { //Se a casa decimal que será CONSERVADA, for IMPAR if ((cDecimais.substr(nDecimais-1, 1) % 2) != 0) { nRetorno = nRetorno.toFixed(2); //Math.round((nRetorno + 0.00001) * 100) / 100; //ARREDONDA } //Se a casa decimal que será CONSERVADA, for PAR else //Se APÓS a casa decimal SUBSEQUENTE, houver ALGUM algarismo MAIOR que ZERO if ( cDecimais.substr(nSubsequente+1, 1) > 0 ) { nRetorno = nRetorno.toFixed(2); //Math.round((nRetorno + 0.00001) * 100) / 100; //ARREDONDA } //Se APÓS a casa decimal SUBSEQUENTE, não houver NENHUM outro algarismo ou TODOS forem iguais a ZERO else { //TRUNCA (Esse é o único momento em que o "arredondamento ABNT" se diferencia do "arredondamento normal") nRetorno = Truncate(nValor, nDecimais); } } return parseFloat(nRetorno); } function Truncate(nValor, nDecimais) { var nRetorno = nValor; spl = nValor.toString().split("."); var cDecimais = spl[1]; if (nDecimais < 1) { return parseInt(nRetorno); } if (cDecimais.length <= nDecimais) { return nRetorno; } //Pega a parte inteira do número e concatena com a substring sem alterar, pois é PAR e vai manter! nRetorno = parseInt(nValor.toString()) + '.' + cDecimais.substr(0, nDecimais); nRetorno = parseFloat(nRetorno); return nRetorno; } :D1 ponto