PROBLEMA EM CALCULO
Aparentemente é um bug mesmo. Só acontece com números decimais pares de uma casa. O vb6 deve fazer o calculo diferente do excel. Notamos que o excel usa a vÃrgula e o vb o ponto como separador decimal. No seu caso, se trocar o 100 por 10000000, vão aparecer tantos 99... quanto o número suporte. Ex.: 600,39999999....(Infinito) = 600,40.
Conclusão é que o vb6 e o access calcula com rotinas internas diferente. O Cdec está forçando um decimal ou até convertendo o valor para um tipo númerico correto da função:
Observe:
O importante é que sua função já está funcionando com minha resposta anterior:
Conclusão é que o vb6 e o access calcula com rotinas internas diferente. O Cdec está forçando um decimal ou até convertendo o valor para um tipo númerico correto da função:
Observe:
Int(500.4 * 100)=50039
Int(500.4 * 1000000)=500399999
Int(cdec(500.4) * 100)=50040
O importante é que sua função já está funcionando com minha resposta anterior:
Int(CDec(1200.655 / 2) * 100) / 100
Colega,
A função está dando erro. Veja esta outra. Testei e atendeu a sua regra:
Private Sub Command1_Click()
MsgBox TiraDecimais(1200.67 / 2, 2)
End Sub
Function TiraDecimais(nValor As Double, nCasas As Integer) As Double
Dim nDecimais As Integer
nDecimais = 10 ^ nCasas [ô]para saber com quantas casas decimais vai ser retornado o número
Dim strValorDecimal As String
strValorDecimal = (nValor * nDecimais)
If InStr(strValorDecimal, [Ô],[Ô]) > 0 Then
TiraDecimais = Val(Mid(strValorDecimal, 1, InStr(strValorDecimal, [Ô],[Ô]) - 1)) / nDecimais
Else
TiraDecimais = Val(strValorDecimal) / nDecimais
End If
End Function
A função está dando erro. Veja esta outra. Testei e atendeu a sua regra:
Private Sub Command1_Click()
MsgBox TiraDecimais(1200.67 / 2, 2)
End Sub
Function TiraDecimais(nValor As Double, nCasas As Integer) As Double
Dim nDecimais As Integer
nDecimais = 10 ^ nCasas [ô]para saber com quantas casas decimais vai ser retornado o número
Dim strValorDecimal As String
strValorDecimal = (nValor * nDecimais)
If InStr(strValorDecimal, [Ô],[Ô]) > 0 Then
TiraDecimais = Val(Mid(strValorDecimal, 1, InStr(strValorDecimal, [Ô],[Ô]) - 1)) / nDecimais
Else
TiraDecimais = Val(strValorDecimal) / nDecimais
End If
End Function
Bem acho que deve ser algum bug da função int, porem pode fazer de outras maneiras:
Citação:
CLng(((1200.6 / 2) * 100)) / 100
ou
(((1200.6 / 2) * 100) 1) / 100
Eh, realmente a função do ROBIU é a mais correta. Testei com vários valores e opções de casas decimais. Um valor bom para testar também é 1200.89
Fiz a adaptação para a minha proposta. Creio que assim, fica mais tecnicamente correta:
Private Sub Command1_Click()
MsgBox TiraDecimais(1200.67 / 2, 2)
End Sub
Function TiraDecimais(nValor As Double, nCasas As Integer) As Double
Dim nDecimais As Integer
nDecimais = 10 ^ nCasas [ô]para saber com quantas casas decimais vai ser retornado o número
TiraDecimais = Int(CDec(nValor) * nDecimais) / nDecimais
End Function
Fiz a adaptação para a minha proposta. Creio que assim, fica mais tecnicamente correta:
Private Sub Command1_Click()
MsgBox TiraDecimais(1200.67 / 2, 2)
End Sub
Function TiraDecimais(nValor As Double, nCasas As Integer) As Double
Dim nDecimais As Integer
nDecimais = 10 ^ nCasas [ô]para saber com quantas casas decimais vai ser retornado o número
TiraDecimais = Int(CDec(nValor) * nDecimais) / nDecimais
End Function
Tópico encerrado , respostas não são mais permitidas