duda decimales sql y c#

07/03/2008 - 13:48 por Claudio Quezada | Informe spam
que tal, tengo una duda respecto del manejo de decimales a nivel de c# y
de sql...

resulta que tenemos un sistema que ha estado funcionando a la prefeccion
durante los ultimos 2 años, ahora gente externa ha creado una aplicacion
que ingresa datos a la misma BD de nuestro sistema.

El problema es que ellos ingresa un valor, por ejemplo "2.5" y en la BD
se guarda como "5.1999998926".

Revisando nuestro sistema me doy cuenta que efectivamente se guarda asi
el valor que ingresamos nosotros, ejemplo ingresamos "2.654" y en la BD
se guarda "2.6539999999999999" cuando se procesa esto en nuestro codigo
se toma de la siguiente manera:

public double Precio = Convert.ToDouble(txtPrecio.Text);

luego eso se pasa por procedimiento almacenado a la BD y según el
profiler de sql llega asi: "2.654000000000000e+000"

cuando lo recupero lo hago de la siguiente forma
if(mRow["Precio"]!ÛNull.Value)mPrecio=Convert.ToDouble(mRow["Precio"]);

y lo despliego así:

txtPrecio.Text = mPrecio.ToString();

Esto ha funcionado, como dije anteriormente, por dos años y sin ningun
problema.

Mi duda es, esto es correcto? nuestro sistema esta mal? o es que el
"nuevo" sistema es el que no esta haciendo la conversion como
corresponde?, acaso hay que configurar algo para que tome esto como
corresponde?

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
07/03/2008 - 15:43 | Informe spam
Cuál es el tipo de datos SQL Server usado para almacenar el valor?

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Claudio Quezada" wrote:

que tal, tengo una duda respecto del manejo de decimales a nivel de c# y
de sql...

resulta que tenemos un sistema que ha estado funcionando a la prefeccion
durante los ultimos 2 años, ahora gente externa ha creado una aplicacion
que ingresa datos a la misma BD de nuestro sistema.

El problema es que ellos ingresa un valor, por ejemplo "2.5" y en la BD
se guarda como "5.1999998926".

Revisando nuestro sistema me doy cuenta que efectivamente se guarda asi
el valor que ingresamos nosotros, ejemplo ingresamos "2.654" y en la BD
se guarda "2.6539999999999999" cuando se procesa esto en nuestro codigo
se toma de la siguiente manera:

public double Precio = Convert.ToDouble(txtPrecio.Text);

luego eso se pasa por procedimiento almacenado a la BD y según el
profiler de sql llega asi: "2.654000000000000e+000"

cuando lo recupero lo hago de la siguiente forma
if(mRow["Precio"]!ÛNull.Value)mPrecio=Convert.ToDouble(mRow["Precio"]);

y lo despliego así:

txtPrecio.Text = mPrecio.ToString();

Esto ha funcionado, como dije anteriormente, por dos años y sin ningun
problema.

Mi duda es, esto es correcto? nuestro sistema esta mal? o es que el
"nuevo" sistema es el que no esta haciendo la conversion como
corresponde?, acaso hay que configurar algo para que tome esto como
corresponde?

Respuesta Responder a este mensaje
#2 Claudio Quezada
07/03/2008 - 15:52 | Informe spam
float(8)

info del sp_help:
Column_name Precio
Type float
Computed no
Length 8
Prec 53
Scale NULL
Nullable yes
TrimTrailingBlanks (n/a)
FixedLenNullInSource (n/a)
Collation NULL

gracias.

Gux (MVP) escribió:
Cuál es el tipo de datos SQL Server usado para almacenar el valor?

Respuesta Responder a este mensaje
#3 Gux (MVP)
07/03/2008 - 19:30 | Informe spam
Normalmente las equivalencias de tipos recomendadas son:

Sql Server Float = System.Data.SqlTypes.SqlDouble = .NET Double

Sql Server Real = System.Data.SqlTypes.SqlSingle = .NET Single

Con esas equivalencias no debería tener problema alguno en el almacenamiento
de números flotantes y reales.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Claudio Quezada" wrote:

float(8)

info del sp_help:
Column_name Precio
Type float
Computed no
Length 8
Prec 53
Scale NULL
Nullable yes
TrimTrailingBlanks (n/a)
FixedLenNullInSource (n/a)
Collation NULL

gracias.

Gux (MVP) escribió:
> Cuál es el tipo de datos SQL Server usado para almacenar el valor?
>

Respuesta Responder a este mensaje
#4 Claudio Quezada
07/03/2008 - 20:26 | Informe spam
Gracias.

Gux (MVP) escribió:
Normalmente las equivalencias de tipos recomendadas son:

Sql Server Float = System.Data.SqlTypes.SqlDouble = .NET Double

Sql Server Real = System.Data.SqlTypes.SqlSingle = .NET Single

Con esas equivalencias no debería tener problema alguno en el almacenamiento
de números flotantes y reales.

Respuesta Responder a este mensaje
#5 Roka
07/03/2008 - 20:46 | Informe spam
si lo recibes en un store procedure, contrólalo con el tamaño que le pones
al parámetro recibido,
aunque lo ideal es que el parámetro sea igual al campo de la tabla.

Róger


"Claudio Quezada" wrote in message
news:OO%
que tal, tengo una duda respecto del manejo de decimales a nivel de c# y
de sql...

resulta que tenemos un sistema que ha estado funcionando a la prefeccion
durante los ultimos 2 años, ahora gente externa ha creado una aplicacion
que ingresa datos a la misma BD de nuestro sistema.

El problema es que ellos ingresa un valor, por ejemplo "2.5" y en la BD se
guarda como "5.1999998926".

Revisando nuestro sistema me doy cuenta que efectivamente se guarda asi el
valor que ingresamos nosotros, ejemplo ingresamos "2.654" y en la BD se
guarda "2.6539999999999999" cuando se procesa esto en nuestro codigo se
toma de la siguiente manera:

public double Precio = Convert.ToDouble(txtPrecio.Text);

luego eso se pasa por procedimiento almacenado a la BD y según el profiler
de sql llega asi: "2.654000000000000e+000"

cuando lo recupero lo hago de la siguiente forma
if(mRow["Precio"]!ÛNull.Value)mPrecio=Convert.ToDouble(mRow["Precio"]);

y lo despliego así:

txtPrecio.Text = mPrecio.ToString();

Esto ha funcionado, como dije anteriormente, por dos años y sin ningun
problema.

Mi duda es, esto es correcto? nuestro sistema esta mal? o es que el
"nuevo" sistema es el que no esta haciendo la conversion como
corresponde?, acaso hay que configurar algo para que tome esto como
corresponde?

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida