Tipo Single

¿Por qué he podido tener problemas al restar números de tipo Single? Al restar 19,95 - 18 me daba de resultado 1,950001 sin embargo al cambiarlo a double se soluciona.
Me gustaría saber porque pasa esto, ya que no ocupamos para nada los 4 bytes del tipo Single.
Respuesta
1
No te lo puedo asegurar pero hasta donde se, se puede deber a la configuración regional de, si quieres prueba cambiando la configuración regional a la de estados unidos y prueba a sa. Por los 4 bytes no te preocupes hoy en día eso no es mucho problema, por la gran velocienen los procesadores.

3 respuestas más de otros expertos

Respuesta
1
Antes que nada, que lenguaje de programación estás usando; porque el problema podría variar según el lenguaje.
De cualquier modo, sea el lenguaje que sea, si querés seguir usando el tipo single te recomendaría que uses una función como format (en visual basic y en java) y le asignes al resultado un formato con solo 2 números luego de la coma!.
Atentamente. Manuel Fernández.
Estoy usando VB .NET y estoy trabajando con números que representan dinero. Me comentaron que para este tipo de números sería bueno usar Decimal :S
Buena idea! Muchas gracias
Si es visual, entonces podes hacer esto:
Monedas= plata - int(plata) 'al restar al número con coma su parte entera me quedo solo con lo que está después de la coma.
Plata= int(plata) 'lo que me quedó lo convierto en entero.
Monedas= mid(monedas, 1,4) 'fijo la longitud total de dígitos, como yo quiero que hayan dos dígitos después de la coma entonces tengo 0, y dos más o sea 4.
Ahora:
total = plata + monedas
Voila!
Atentamente. Manuel Fernández.
Respuesta
1
Primero tengo que saber 1 cosa: que utilizas, ¿vb.net o c#.net?
vb.net.
Me comentaron que para los números que utilizase como Moneda mejor los pasara a Decimal y de momento funciona :S
También es una posibilidad...
Pero lo que tú decías es precisamente porque los 2 bytes que no usas, al no especificar su contenido en la memoria, visual studio los rellena con lo que tenía en la memoria, es decir, sólo hace caso a los 2 bytes de mayor peso, que son los que en realidad "machaca" en la memoria. Al hacer el paso a long, "trunca" el valor y coge hasta el contenido más significativo que tenía (1,95) y el resto lo obvia. Lo curioso es que a mí también me pasa con el long si no le especifico el contenido concreto del resto de bytes... es raro que a ti no te diera problemas...
Con decimal usa 2 bytes de memoria y para cifras pequeñas de dará menos problema, efectivamente!
Acostumbrate a hacer un convert. Tolong o un convert. Toshort del string completo del número que desees y ya verás como así seguro que te entiende perfectamente el vs.
Lo pasé todo a Decimal, pero me surgió un problema: Decimal no aceptaba decimales. El problema estaba en que al introducirlo en la base de datos lo introducía como OleDb. Decimal y se ve que no admite decimales; lo arreglé usando OleDb.Currency :)
Respuesta
1
Estuve buscando en la documentación y no hay explicación para ese problema, hice unas pruebas y a veces da error, y a veces no, debe ser un bug del framework, o una mala utilización del tipo de datos.
Lamento no poder ayudarte más, a mi también me dejo con la duda.
Me comentaron de utilizar el tipo Decimal para números relacionados con precios. Probaré a ver.
Gracias por molestarte :)
1 saludo!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas