¿Por qué C # muestra un valor redondeado en la línea de escritura de la consola, pero inserta en la base de datos como valor real? -- # campo con sql-server camp Relacionados El problema

Why does C# display a rounded value in console writeline, but inserts into database as actual value?


1
vote

problema

Español

Este es un poco de un teaser del cerebro para mí. Utilizamos un servidor remoto para almacenar nuestros datos. No tengo control sobre la convención de nombres o cómo se almacenan los datos allí. Hay un SPRC que hemos escrito en ese servidor para llamar valores de una tabla allí. Uno de los valores, el precio, vuelve como 6.52 ... Para este ejemplo en particular.

ingrese la descripción de la imagen aquí

El problema fue cuando luego llamé a ese valor después de que se almacenó en nuestra propia base de datos local, se mostró como 6.51.

Pensando que era algo que ver con el redondeo, y que no estaba sucediendo a medida que los datos se transitaban a través de mi programa C #, saqué un DataTable que solo recuperó la fila en cuestión del servidor remoto donde existía ese valor (método C # código al final de este mensaje). Cuando luego hice una consola para mostrarme el valor que dijo que era 6.52. En este punto, estaba feliz porque obviamente estaba tirando del valor correcto y debe cambiarse en nuestro servidor local a medida que se ingresa.

ingrese la descripción de la imagen aquí

Al mismo tiempo, había cambiado el número de lugares decimales para esa columna en nuestro servidor local de 2 a 4. Cuando recuperé ese registro, mostró el valor como 6.5199. Así que al menos estoy obteniendo el valor correcto. Aunque mi pregunta es ¿por qué la consola WritLine se mostrará un número redondeado? ¿Mi suposición sería que mostraría el valor a medida que se almacena, no lo rodea?

ingrese la descripción de la imagen aquí

¿Alguien sabe lo que está pasando aquí?

Método C #:

  public void getSupplierMasterPriceTEST()         {             DataTable priceTable = new DataTable();             string queryString = "{call sproc164407_2053096_666689 ()}";             OdbcDataAdapter odbcAdapter = new OdbcDataAdapter();             OdbcCommand command = new OdbcCommand(queryString, odbcConnection);             try             {                 odbcAdapter.SelectCommand = command;                 odbcConnection.Open();                 odbcAdapter.Fill(priceTable);                 Console.WriteLine("Adding to SQL Server");                 //serverConnection.copyTableToServer("Supplier_Master_Price", priceTable);                 foreach(DataRow row in priceTable.Rows)                 {                     foreach (object item in row.ItemArray)                     {                         Console.WriteLine(item);                     }                 }                 //serverConnection.removeDuplicatesSupplerMasterPrice();             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());             }             finally             {                 odbcConnection.Close();             }         }   
Original en ingles

This is a bit of a brain teaser for me. We use a remote server to store our data. I have no control over naming convention or how data is stored in there. There is an sproc we have written on that server to call values from a table there. One of the values, price, comes back as 6.52....for this particular example.

enter image description here

The problem was when I then called that value after it was stored in our own local database it showed as 6.51.

Thinking it was something to do with rounding, and that it wasn't happening as the data transitioned through my c# program, I pulled a datatable that only retrieved the row in question from the remote server where that value existed(C# method code at end of this message). When I then did a console writeline to show me the value it said it was 6.52. At this point I was happy because obviously it was pulling the right value and it must be getting changed on our local server as it is entered.

enter image description here

At the same time I had changed the number of decimal places for that column in our local server from 2 to 4. When I retrieved that record it showed the value as 6.5199. So at least I am getting the right value. My question is though why would the console writeline be displaying a rounded number? My assumption would be that it would show the value as it is stored not round it?

enter image description here

Does anyone know what is going on here?

C# Method:

public void getSupplierMasterPriceTEST()         {             DataTable priceTable = new DataTable();             string queryString = "{call sproc164407_2053096_666689 ()}";             OdbcDataAdapter odbcAdapter = new OdbcDataAdapter();             OdbcCommand command = new OdbcCommand(queryString, odbcConnection);             try             {                 odbcAdapter.SelectCommand = command;                 odbcConnection.Open();                 odbcAdapter.Fill(priceTable);                 Console.WriteLine("Adding to SQL Server");                 //serverConnection.copyTableToServer("Supplier_Master_Price", priceTable);                 foreach(DataRow row in priceTable.Rows)                 {                     foreach (object item in row.ItemArray)                     {                         Console.WriteLine(item);                     }                 }                 //serverConnection.removeDuplicatesSupplerMasterPrice();             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());             }             finally             {                 odbcConnection.Close();             }         } 
     
       
       

Lista de respuestas

3
 
vote

Parece que estás almacenando como un doble y no un decimal. DOURLES Use matemáticas de puntos flotantes que adornan en precisión en función del tamaño del número. Los decimales son un número con un número definido de decimales especificados.

nunca use nunca un doble por cálculos de dinero.

 

Looks like you are storing as a double and not a decimal. Doubles use floating point math which varries in precicion based on the size of the number. Decimals are a number with a defined number of decimal places specified.

Never ever ever use a double for money calculations.

 
 
         
         
0
 
vote

Intente cambiar el tipo de columna en la tabla DB a decimal (18,2)

 

Try to change column type in db table to decimal(18,2)

 
 
0
 
vote

Locke me venció. La respuesta en esta pregunta lo explica más en profundidad: enlace

Más información sobre el error de redondeo: enlace

Un artículo inspirador más con una explicación de .NET: punto flotante binario y .net

 

Locke beat me to it. The answer in this question explains it more in depth: Link

More information about the rounding error: Link

One more inspiring article with a .NET explanation: Binary floating point and .NET

 
 

Relacionados problema

88  Cómo exportar datos de SQL Server 2005 a MySQL [CERRADO]  ( How to export data from sql server 2005 to mysql ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

87  SQL Server 2005 Implementación de MySQL Reemplazar en?  ( Sql server 2005 implementation of mysql replace into ) 
MySQL tiene este comando increíblemente útil y propietario 99887776611 SQL. ¿Se puede emular fácilmente en SQL Server 2005? Inicio de una nueva transacc...

321  Base de datos de SQL Server de versiones  ( Versioning sql server database ) 
Quiero obtener mis bases de datos en Control de versión. ¿Alguien tiene algún consejo o artículos recomendados para comenzar? Siempre querré tener al menos ...

146  ¿Marque los cambios en una tabla de SQL Server?  ( Check for changes to an sql server table ) 
¿Cómo puedo monitorear una base de datos de SQL Server para cambios en una tabla sin usar desencadenantes o modificando la estructura de la base de datos de n...

30  Desplegando bases de datos de SQL Server de la prueba para vivir  ( Deploying sql server databases from test to live ) 
Me pregunto cómo ustedes administran la implementación de una base de datos entre 2 servidores SQL, específicamente SQL Server 2005. Ahora, hay un desarrollo ...

30  Edición de registros de bases de datos por múltiples usuarios  ( Editing database records by multiple users ) 
He diseñado tablas de base de datos (normalizada, en un servidor MS SQL) y creó un extremo frontal independiente de Windows para una aplicación que será utili...

26  ¿Por qué la indexación de texto completo de SQL no tiene resultados de devolución de texto para las palabras que contienen #?  ( Why doesnt sql full text indexing return results for words containing ) 
Por ejemplo, mi consulta es como la siguiente utilizando SQL Server 2005: SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') Tengo un índice de tex...

27  ¿Es apropiado Windows Server 2008 "Server Core" apropiado para una instancia de SQL Server?  ( Is windows server 2008 server core appropriate for a sql server instance ) 
Estoy configurando un cuadro dedicado de SQL Server 2005 en Windows Server 2008 esta semana, y quisiera apagarlo para ser lo más barboles posible mientras aún...

37  Actualización de SQL Server 6.5  ( Upgrading sql server 6 5 ) 
Sí, lo sé. La existencia de una copia en funcionamiento de SQL Server 6.5 en 2008 es absurda. que estipuló, ¿cuál es la mejor manera de migrar desde 6.5 ...

14  Collación del cliente y SQL Server 2005  ( Client collation and sql server 2005 ) 
Estamos actualizando un programa existente de Win2k/SQL Server 2k a Windows 2003 and SQL Server 2005 , así como la compra de un nuevo programa que también ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos