Que precisão decimal o Excel suporta?

1

Qual precisão o Excel suporta? Tentei calcular 0.800000000000001 / 2 e recebi resultado incorreto de 0.40000000000000000000 , onde deveria ser 0.4000000000000005

    
por Max Wizard K 15.08.2016 / 10:25

2 respostas

3

O Excel suporta aritmética de Ponto Flutuante, que tem um limite de 15 casas decimais. Aqui está a investigação e referência.

Aopesquisaresteassunto,descobriu-sequeapenas15dígitossãoarmazenadosemquantidadesaritméticas,devidoàNotaçãodoPontoFlutuantecomosuspeita.

Depoisdeprocurarporessesuspeitoculpado,areferênciaéencontradaaqui: link e aqui

Portanto, 15 casas decimais são o máximo transferido em ponto flutuante. Aqui está o mesmo exemplo em 14 casas decimais. Observe o 5 na décima sexta casa decimal; apresenta mais uma demonstração dos limites do Ponto Flutuante.

Paratestarumateoria,comentadaporummembrodestefórum,decidiadicionaresteadendo.Não,nemmesmoemVBaavariávelDoublepodeultrapassaraslimitaçõesdoPontoFlutuante.EuuseiDoubleprecisioneretorneiovalorcomoStringparademonstraraindamaisaqui:

Umaexceçãoàregra!

Obrigado,RonRosenfeld.Comrelaçãoàúltimaimagem,emrelaçãoaoVBa.SevocêestiverusandoocódigoVBa,entãoutilizaroVBalibraryfunctionCDec()defatocapturaaprecisãonãocobertanoslimites,conformediscutidoacima.Noentanto,comumaressalva,vocêdeveretornarosdadoscomoumaStringparafinsdeexibição.Umareferênciapodeserencontradaaqui: link

    
por 16.08.2016 / 21:03
2

Aqui está um exemplo de como usar o tipo de dados Decimal VBA em operações matemáticas simples, para obter uma precisão maior que a precisão de 15 dígitos decimais do Excel.

Obviamente, você pode expandir isso para usar em outros tipos de operações. No entanto, se a precisão de 28 decimais, ou se o intervalo de número permitido (consulte a Ajuda) não for suficiente, você precisará de uma ferramenta diferente.

O exemplo abaixo é apenas para adição, multiplicação e divisão. Mas você pode facilmente estendê-lo a outras operações ou implementá-lo de maneira diferente, de acordo com o que realmente precisa.

Observe que os resultados são retornados como uma string (texto). Caso contrário, o Excel não poderá exibir os resultados. Se você estivesse usando apenas no VBA, você poderia retornar o resultado como Variante / Decimal.

Function HiPrecMath(sOp As String, ParamArray Factors() As Variant) As String
    Dim V As Variant
        V = Factors
    If sOp Like "Add*" Then
        HiPrecMath = vbADD(V)
    ElseIf sOp Like "Mult*" Or sOp Like "Prod*" Then
        HiPrecMath = vbMULT(V)
    ElseIf sOp Like "Div*" Then
        HiPrecMath = vbDIV(V)
    End If
End Function

Private Function vbADD(F) As String
    Dim vRes As Variant
    For I = 0 To UBound(F)
        vRes = vRes + CDec(F(I))
    Next I
vbADD = vRes
End Function

Private Function vbMULT(F) As String
    Dim vRes As Variant
    vRes = F(0)
    For I = 1 To UBound(F)
        vRes = vRes * CDec(F(I))
    Next I
vbMULT = vRes
End Function

Private Function vbDIV(F) As String
    Dim vRes As Variant
    vRes = F(0)
    For I = 1 To UBound(F)
        vRes = vRes / CDec(F(I))
    Next I
vbDIV = vRes
End Function

Aqui está um exemplo usando seus dados:

    
por 17.08.2016 / 03:48