103 votos

la diferencia entre el flotador y el tipo de datos decimal

¿Qué diferencia hace cuando puedo usar float decimal y tipos de datos en mysql. Que es ideal para el uso.

115voto

kanap008 Puntos 1070

Esto es lo que he encontrado cuando he tenido esta duda.

mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G
*************************** 1. row ***************************
  @a := (a/3): 33.333333333
  @b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

El decimal hizo exactamente lo que se supone que se debe hacer en estos casos, truncado el resto, perdiendo así la 1/3 parte.

Así que por la suma de la coma decimal es mejor, pero para las divisiones del flotador mejor, hasta cierto punto, por supuesto. Quiero decir, el uso de DECIMALES no dará una "prueba de fallas de la aritmética" en cualquier medio.

Espero que esto ayude.

53voto

Michael Petrotta Puntos 35647

Un "flotador" en la mayoría de los entornos de punto flotante binario tipo. Se puede con precisión la tienda base-2 valores (hasta cierto punto), pero no puede con precisión muchas de base 10 (decimal) de los valores. Los flotadores son los más apropiados para cálculos científicos. Son no apropiados para la mayoría de los negocios orientados a la matemática, y el uso inadecuado de la flota va a morder. Muchos valores decimales no pueden ser exactamente representados en base-2. 0.1 no se puede, por ejemplo, y para que usted vea resultados extraños como 1.0 - 0.1 = 0.8999999.

Los decimales de la tienda base-10 números. Decimal es un buen tipo para la mayoría de los negocios de matemáticas (pero cualquier elemento incorporado en el "dinero" de tipo es el más apropiado para realizar cálculos financieros), donde el rango de valores supera la proporcionada por los tipos enteros, fracciones y valores son necesarios. Decimales, como el nombre lo indica, están diseñados para la base 10 números que con precisión puede almacenar valores decimales (de nuevo, hasta un cierto punto).

12voto

IfLoop Puntos 59461

No sólo el específico de MySQL, la diferencia entre el flotador y el decimal tipos es la forma en que se representan los valores fraccionarios. Los tipos de punto flotante representar fracciones en binario, que sólo puede representar valores como {m*2^n | m, n Integers} . valores tales como 1/5 no pueden ser exactamente representados (sin redondear error). Los números decimales son igualmente limitadas, pero representar números como {m*10^n | m, n Integers}. Decimales todavía no puede representar números como 1/3, pero a menudo es el caso en muchos campos, como el de las finanzas, que la expectativa es que ciertas fracciones decimales siempre puede ser expresado sin pérdida de fidelidad. Desde un número decimal puede representar un valor como $0.20 (una quinta parte de un dólar), es el preferido en esas situaciones.

11voto

user2548100 Puntos 610

MySQL recientemente ha cambiado la forma en que se almacenan el tipo DECIMAL. En el pasado se almacenan los caracteres (o nybbles) para cada uno de los dígitos que componen una ASCII (o nybble) la representación de un número - vs - un complemento a dos enteros, o algún derivado de ella.

El actual formato de almacenamiento para el separador DECIMAL es una serie de 1,2,3,o 4 bytes enteros cuyos bits se concatenan para crear un complemento a dos el número con un decimal implícita punto, definidos por el usuario y almacenados en la base de datos de esquema cuando se declara la columna y especificar que es DECIMAL tamaño y la posición del punto decimal.

A modo de ejemplo, si usted toma una de 32 bits int usted puede almacenar cualquier número de 0 a 4,294,967,295. Que sólo de forma fiable cubre 999,999,999, así que si tiraste 2 bits y usados (1<<30 -1) te dan nada. Cubriendo todos los 9 dígitos con sólo 4 bytes es más eficiente que cubre 4 dígitos en 32 bits con 4 caracteres ASCII, o 8 nybble dígitos. (un nybble es de 4 bits, lo que permite valores de 0 a 15 años, más de los que se necesitan para 0-9, pero no puede eliminar los desechos por ir a 3 bits, ya que sólo cubre a los valores de 0 a 7)

El ejemplo utilizado en el MySQL de documentos online utiliza DECIMAL(18,9) como un ejemplo. Este es de 9 dígitos antes y 9 dígitos detrás de la implícitas punto decimal, que como se explicó anteriormente, requiere de los siguientes almacenamiento.

18 8-bits de caracteres: 144 bits

18 4 bits nybbles: 72 bits

Como 2 enteros de 32 bits: de 64 bits

Actualmente DECIMAL admite un máximo de 65 dígitos, como DECIMAL(M,D), donde el valor más grande de M permitido es de 65 años, y el mayor valor de D permitido es de 30.

Así como no exigir grupos de 9 dígitos al mismo tiempo, los números enteros más pequeños que los de 32 bits se utilizan para agregar dígitos con 1,2 y 3 bytes enteros. Por alguna razón que desafía a la lógica, firmado, en lugar de unsigned int fueron utilizados, y, al hacerlo, 1 bit de desechos, lo que resulta en las siguientes capacidades de almacenamiento. Para el 1,2 y 4 bytes enteros a los perdidos bits no importa, pero para el 3 byte, int, es un desastre porque todo un dígito se pierde debido a la pérdida de la que solo bit.

Con un 7 bits de tipo int: 0 - 99

Con un 15 bits int: 0 - 9,999

Con 23 bits de tipo int: 0 - 999,999 (0 - 9,999,999 con una de 24 bits int)

1,2,3 y 4 bits enteros se concatenan para formar un "pool" DECIMAL utiliza para representar el número, precisamente, como un complemento a dos con signo. El punto decimal NO se almacena, es implícita.

Esto significa que no ASCII a int conversiones necesarias de la base de datos del motor para convertir el "número" en algo la CPU reconoce como un número. Sin redondeo, no hay errores de conversión, es un número real la CPU pueden manipular.

Los cálculos en este arbitrariamente grande entero debe ser hecho en software, ya que no hay soporte de hardware para este tipo de número, pero estas bibliotecas son muy antiguos y altamente optimizado, después de haber sido escrita hace 50 años para el apoyo de IBM 370 Fortran de precisión arbitraria de datos de punto flotante. Son todavía mucho más lento que el de tamaño fijo entero álgebra hecho con CPU entero de hardware, o en los cálculos de punto flotante hecho en la FPU.

En términos de eficiencia de almacenamiento, debido a que el exponente de un flotador conectado a todas y cada una de flotación, especificando de forma implícita, donde la coma es, es masivamente redundante, y por lo tanto ineficaz para DB de trabajo. En una DB que ya sabes en donde el punto decimal es ir de frente, y cada fila de la tabla que tiene un valor para una columna DECIMAL sólo hay que mirar a la 1 y única especificación del lugar en el que el punto decimal se debe de colocar, almacenados en el esquema como argumentos a una DECIMAL(M,D) la implicación de la M y la D valores.

De los muchos comentarios que se encuentran aquí acerca de cuál es el formato a ser utilizado para varios tipos de aplicaciones son correctos, así que no voy a insistir sobre el punto. Me he tomado el tiempo para escribir esto aquí porque quien es el mantenimiento de los enlaces de MySQL documentación en línea no entiendo nada de lo anterior y después de las rondas de cada vez más frustrantes intentos de explicar a ellos me di por vencido. Una buena indicación de lo poco que entendía lo que eran la escritura es muy confusa y casi indescifrable presentación de la materia.

Como pensamiento final, si usted tiene la necesidad de alta precisión de punto flotante de la computación, ha habido grandes avances en punto flotante de código en los últimos 20 años, y el soporte de hardware para 96 bits y Cuádruple Precisión float están a la vuelta de la esquina, pero hay buena precisión arbitraria bibliotecas por ahí si la manipulación del valor almacenado es importante.

9voto

Skylar Saveland Puntos 4131

decimal es para cantidades fijas como el dinero donde usted desea un determinado número de decimales. Los flotadores son para almacenar ... de punto flotante de precisión de los números.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X