Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Muricy

Erro de calculo?

Recommended Posts

<%
response.write 23-23 & "<br>"
response.write 23.9-23 & "<br>"
response.write 23.99-23 & "<br>"
response.write 23.999-23 & "<br>"
response.write 23.9999-23 & "<br>"
response.write 23.99999-23 & "<br>"
response.write 23.999999-23 & "<br>"
%>

Esta retornando o seguinte resultado...

 

0

0,899999999999999

0,989999999999998

0,998999999999999

0,9999

0,99999

0,999998999999999

Ou estou maluco... ou não estou enxergando direito.

Alguem sabe dizer se isso esta acontecendo só comigo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente esse "erro" acontece no VBScript. Se você utilizar FormatNumber consegue arredondar para o valor correto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

- você pode usar o formatnumber ou formatcurrency se kiser exibir em moeda.

 

FormatarEmNumber ( )

Devolve uma expressão formatada como Number

FormatarEmNumber = FormatNumber("123123123",3)
'Devolve 123.123.123,000

FormatCurrency ( )

 

Devolve uma expressão formatada para currency ( tipo de moeda instalada no Control Panel ).

MinhaMoeda = FormatCurrency(34) 
' Devolve num servidor português "R$ 34,00"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que absurdo isso...

Façam esse calculo em uma calculadora, o resultado é 1... e no ASP o resultado é 0.999999999

 

<%
Dim A,B,D

A=23.9
B=23
D=A-B
' O resultado de D deveria ser 0.9
Response.Write D & "<br>"
' Se D<.9 poderia ter alguma rotina para tratar de alguma forma o valor
if D<.9 then response.write "Erro de soma absurdo<br>"
' Mostrar o resultado de D que deveria ser 0.9
Response.Write D & "<br>"
'Então vamos diminuir de D o valor de 0.0001
D=D-.0001
Response.Write D & "<br>"
D=D+.1001
' O resultado deveria ser 1 e não 0.999999999999
Response.Write "Resultado Final: " & D & "<br>"
if D<>1 then response.write "Erro novamente<br>"
%>

Já imaginou um site que faz calculos de renegociação de dividas...correção de valores... etc...

Isso é terrivel.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem nada de absurdo. Isso é matemática.

 

Conversei com meu amigo Ted k' ontem ele me lembrou das dizimas e que a calculadora por si só arredonda...

 

E realmente faz sentido, pois fiz algumas pesquisas e vi que está correto, da mesma forma que 0.90000 <> 1 e 0.9999 = 1.

 

Outro detalhe importante, fiz os testes em outras linguagens de programação e vi que isso não é mérito do VBScript, todas retornam os mesmos resultados apresentados acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é absurdo???

 

<%
response.write "1.99 - 1 = " & 1.99-1 & "<br>"
response.write "2.99 - 2 = " & 2.99-2 & "<br>"
response.write "5.99 - 5 = " & 5.99-5 & "<br>"
response.write "10.99 - 10 = " & 10.99-10 & "<br>"
response.write "15.99 - 15 = " & 15.99-15 & "<br>"
response.write "23.99 - 23 = " & 23.99-23 & "<br>"
response.write "40.99 - 40 = " & 40.99-40 & "<br>"
%>

1.99 - 1 = 0,99

2.99 - 2 = 0,99

5.99 - 5 = 0,99

10.99 - 10 = 0,99

15.99 - 15 = 0,99

23.99 - 23 = 0,989999999999998

40.99 - 40 = 0,990000000000002

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você for pensar que é absurdo, então nunca usará uma linguagem de programação, pois na programação a dizima faz diferença e é por isso que ela existe.

 

Você é o programador, você tem o dever de arredondar quando necessário e fazer os cálculos corretamente.

 

Obs. Testei em 5 linguagens e as 5 retornaram o mesmo resultado. Acredito que todas trabalham da mesma forma (posso está errado).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não existe dizima em operações de soma ou subtração... dizimas periodicas, simples ou compostas são geradas em calculos de frações ou divisões.

A menos que um dos fatores da adição ou subtração sera o resultado de uma divisão que gere dizimas.

 

O que relato aqui é que deve ser levado em consideração esse tipo de problema muitas vezes pode passar despercebido por qualquer um e gerar um problema imenso no futuro.

 

Pois se tenho no meu bolso, R$ 70,99 e pago R$ 70,00 não venha alguém me dizer que fiquei na carteira com R$ 0,989999999999995 e por obrigação minha tenho que arredondar um valor que não existiria necessidade de arredondamento.

 

O que estou precisando saber é por que isso acontece... resolver isso é fácil... e simples... mas porque isso acontece se ocorre em todas as linguagens(ou quase todas)???

Compartilhar este post


Link para o post
Compartilhar em outros sites

executa este code:

 

<% 
if request.form("operation") ="" then
isnew = "yes"
session("strlog") = session("strlog") &  "<b>registro</b><br>"
session("strlog") = session("strlog") & " log inicializado " & time & " em " & date & "<br>"
'response.write session("strlog")
else
operation = request.form("operation")
num1 = cdbl(request.form("num1"))
num2 = cdbl(request.form("num2"))
if isnumeric(num1) = false or isnumeric(num2) = false then
response.redirect "calc.asp"
end if
end if
%>

<html>
<head>
	<title>Calc</title>
	<style>
	.simForm {border:1px solid black; background:#D7E5F6; color:black; border-top-color:black; border-right-color:black; border-bottom-color:black; border-left-color:black; font-size:13px}
	</style>
</head>

<body vlink="blue" alink="blue" link="blue">

<center><font size="2" face="tahoma" color="black">
Calc v1.0<br><br>

<% if isnew = "yes" then %>
<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" class="simForm">  
Oper: <select name="operation" class="simForm">
<option name="add">Adição</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  

Num 2: <input type="text" name="num2" size="5" maxlength="10" class="simForm">  
<input type="submit" value=" = " class="simForm">
</form>
<%
elseif operation ="Adição" then
answer = num1 + num2
response.write "Calc Somou!<BR>Resposta = " & Formatnumber(answer,2) 
%>

<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" value="<%=answer%>" class="simForm">   
Oper: <select name="operation" class="simForm">
<option name="add">Adição</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  
Num 2: <input type="text" name="num2" size="5" maxlength="10"class="simForm">  
<input type="submit" value=" = " class="simForm">
</form><p>
<table width="500" align="center"><tr><td align="left">
<font size="1" face="verdana" color="blue"><%
session("strlog") = session("strlog") & "você somou" & num1 & " + " & num2 & " o resultado -> " & Formatnumber(answer,2) & "<br>"
response.write session("strlog") %> </td></tr></table>
<%
elseif operation ="Subtração" then
answer = num1 - num2
response.write "Calc Subtraiu<BR> Resposta = " & Formatnumber(answer,2)
%></font>
<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" value="<%=answer%>" class="simForm">  
Oper: <select name="operation" class="simForm">
<option name="add">Adição</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  
Num 2: <input type="text" name="num2" size="5" maxlength="10" class="simForm">  
<input type="submit" value=" = " class="simForm">
</form>
<table width="500" align="center"><tr><td align="left">
<p><font size="1" face="verdana" color="blue"><%
session("strlog") = session("strlog") & "você subtraiu " & num1 & " - " & num2 & " o resultado -> " & Formatnumber(answer,2) & "<br>"
response.write session("strlog")
%>
</td></tr></table>

<%
elseif operation ="Multiplicação" then
answer = num1 * num2
response.write "Calc multiplicou<BR> Resposta = " & Formatnumber(answer,2)
%></font>
<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" value="<%=answer%>" class="simForm">  
Oper: <select name="operation" class="simForm">
<option name="add">Adição</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  
Num 2: <input type="text" name="num2" size="5" maxlength="10" class="simForm">  
<input type="submit" value=" = " class="simForm">
</form>
<table width="500" align="center"><tr><td align="left">
<p><font size="1" face="verdana" color="blue"><%
session("strlog") = session("strlog") & "você multiplicou " & num1 & " X " & num2 & " igual -> " & Formatnumber(answer,2) & "<br>"
response.write session("strlog") %></font>
</td></tr></table>
<%

elseif operation ="Divisão" then
if num2 = 0 then
response.write "não faz divisão por Zero - você faz!?"
else
answer = num1 / num2
response.write "dividiu!<BR> Resposta = " & Formatnumber(answer,2)
end if
%>

<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" value="<%=answer%>" class="simForm">  
Oper: <select name="operation" class="simForm">
<option name="add">Add</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  
Num 2: <input type="text" name="num2" size="5" maxlength="10" class="simForm">  
<input type="submit" value=" = " class="simForm">
</form>
<table width="500" align="center"><tr><td align="left">
<p><font size="1" face="verdana" color="blue">
<%
session("strlog") = session("strlog") & "você dividiu " & num1 & " / " & num2 & " igual -> " & Formatnumber(answer,2) & "<br>"
response.write session("strlog")  %></font>
</td></tr></table>
<%
else 
%>
<form method="post" action="calc.asp">
Num 1: <input type="text" name="num1" size="5" maxlength="10" class="simForm">  
Oper: <select name="operation" class="simForm">
<option name="add">Adição</option>
<option name="subtract">Subtração</option>
<option name="multiply">Multiplicação</option>
<option name="divide">Divisão</option>
</select>  
Num 2: <input type="text" name="num2" size="5" maxlength="10" class="simForm">  
<input type="submit" value=" = " class="simForm">
</form><%
end if
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

pergunta: xan o que é isso?

 

Amigo da dúvida é o seguinte.

 

isso é matematica, se ele não tiver valor intério ele cria um valor decimal ou dízima periódica, todas as lingagens vão fazer isso se você não dize a elas o que vem pela frente, o que você tem que fazer é igual a calculadora, formatar seu numero.

 

<%
response.write formatNumber(23-23,2) & "<br>"
response.write formatNumber(23.9-23,2) & "<br>"
response.write formatNumber(23.99-23,2) & "<br>"
response.write formatNumber(23.999-23,2) & "<br>"
response.write formatNumber(23.9999-23,2) & "<br>"
response.write formatNumber(23.99999-23,2) & "<br>"
response.write formatNumber(23.999999-23,2) & "<br>"
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.