Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
<%
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>">
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?
nossa aqui deu igualzinho O.O
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"
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>"Isso é terrivel.
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.
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
é só formatar!!
formatNumber(), como citado por hargon anteriormente!
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).
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)???
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>"<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><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
%>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>"
Realmente esse "erro" acontece no VBScript. Se você utilizar FormatNumber consegue arredondar para o valor correto.