En Excel, cuando ingreso 22222.09482, veo el número 22222.0948199999 en la barra de fórmulas

28

¿Podrían ayudarme? Ya que tengo una situación extraña en la que cuando ingreso un número 22222.09482 en la celda, veo un número diferente 22222.0948199999 en la barra de fórmulas. A continuación se muestra la instantánea del problema.

Error de muestra

Veo el mismo comportamiento cuando ingreso los siguientes números:

22222.09482
33333.09482
44444.09482
55555.09482

pero cuando entro 11111.09482 y 66666.09482, 77777.09482 .. hasta 99999.09482, entonces se muestran correctamente. No estoy seguro de si esto está relacionado con el redondeo. No configuré ningún perfil de redondeo. ¿Podría por favor ayudarme a resolver el problema?

usuario954171
fuente
1
Neat find, lo mismo para mí, ¿puedes usarlo ROUND()? =ROUND(A1,5), luego copie / pegue los datos como valores y elimine los números originales?
BruceWayne
1
@BruceWayne, curiosamente, ROUND()muestra los dígitos correctos, pero el valor de copiar / pegar lo devuelve al problema original.
Rey Juna
1
@ReyJuna: luego, ROUND(A1,5)vuelva a hacer los valores pegados. Luego copie / pegue esos valores, y Round()nuevamente, luego copie / pegue. ...: P ... eso es interesante, y parece que @EugenRieck tiene el razonamiento. ¡Buena pregunta!
BruceWayne
1
¿Realmente te importa la diferencia entre 22222.09482 y 22222.0948199999? Es una diferencia de 5 partes en 100 billones.
Russell Borogove
44
¿Se han roto las matemáticas de coma flotante? . Sin embargo eso es probablemente un error, ya que doubletiene la suficiente precisión que cuando redondeadas muestra los valores correctos como la mayoría de la gente espera
phuclv

Respuestas:

31

Es un error

Excel utiliza la representación de doble precisión IEEE habitual, de acuerdo con otras respuestas. Su precisión es de 53 dígitos binarios significativos, que corresponde a aproximadamente 16 dígitos decimales.

Siempre es "seguro" mostrar los primeros 15 dígitos decimales significativos. En el sentido de que cualquier número decimal "presentado" dado con 15 dígitos se puede distinguir con seguridad de los números obtenidos cambiando la cifra decimal 15 por uno. Por ejemplo, los números de 15 dígitos:

22222.09481 99999
22222.09482 00000
22222.09482 00001

mapear a tres números distintos de doble precisión. Ninguno de estos tres será "vecinos" en la representación de doble precisión, en este caso particular.

Entonces, confundir los dos primeros en la pantalla del usuario, es un error de Excel.

De hecho, en este dominio (entre 16384 y 32768), la precisión absoluta es 2 -38 , y los siguientes números son representables:

...
22222.09481 99998 96571 9714760780334472656250000
22222.09481 99999 00209 9502831697463989257812500 <-- the one closest to what Excel showed to the user
22222.09481 99999 03847 9290902614593505859375000
22222.09481 99999 07485 9078973531723022460937500
22222.09481 99999 11123 8867044448852539062500000
22222.09481 99999 14761 8655115365982055664062500
22222.09481 99999 18399 8443186283111572265625000
22222.09481 99999 22037 8231257200241088867187500
22222.09481 99999 25675 8019328117370605468750000
22222.09481 99999 29313 7807399034500122070312500
22222.09481 99999 32951 7595469951629638671875000
22222.09481 99999 36589 7383540868759155273437500
22222.09481 99999 40227 7171611785888671875000000
22222.09481 99999 43865 6959682703018188476562500
22222.09481 99999 47503 6747753620147705078125000
22222.09481 99999 51141 6535824537277221679687500
22222.09481 99999 54779 6323895454406738281250000
22222.09481 99999 58417 6111966371536254882812500
22222.09481 99999 62055 5900037288665771484375000
22222.09481 99999 65693 5688108205795288085937500
22222.09481 99999 69331 5476179122924804687500000
22222.09481 99999 72969 5264250040054321289062500
22222.09481 99999 76607 5052320957183837890625000
22222.09481 99999 80245 4840391874313354492187500
22222.09481 99999 83883 4628462791442871093750000
22222.09481 99999 87521 4416533708572387695312500
22222.09481 99999 91159 4204604625701904296875000
22222.09481 99999 94797 3992675542831420898437500
22222.09481 99999 98435 3780746459960937500000000 <-- the one closest to what the user types
22222.09482 00000 02073 3568817377090454101562500
22222.09482 00000 05711 3356888294219970703125000
22222.09482 00000 09349 3144959211349487304687500
22222.09482 00000 12987 2933030128479003906250000
22222.09482 00000 16625 2721101045608520507812500
22222.09482 00000 20263 2509171962738037109375000
22222.09482 00000 23901 2297242879867553710937500
22222.09482 00000 27539 2085313796997070312500000
22222.09482 00000 31177 1873384714126586914062500
22222.09482 00000 34815 1661455631256103515625000
22222.09482 00000 38453 1449526548385620117187500
22222.09482 00000 42091 1237597465515136718750000
22222.09482 00000 45729 1025668382644653320312500
22222.09482 00000 49367 0813739299774169921875000
22222.09482 00000 53005 0601810216903686523437500
22222.09482 00000 56643 0389881134033203125000000
22222.09482 00000 60281 0177952051162719726562500
22222.09482 00000 63918 9966022968292236328125000
22222.09482 00000 67556 9754093885421752929687500
22222.09482 00000 71194 9542164802551269531250000
22222.09482 00000 74832 9330235719680786132812500
22222.09482 00000 78470 9118306636810302734375000
22222.09482 00000 82108 8906377553939819335937500
22222.09482 00000 85746 8694448471069335937500000
22222.09482 00000 89384 8482519388198852539062500
22222.09482 00000 93022 8270590305328369140625000
22222.09482 00000 96660 8058661222457885742187500
22222.09482 00001 00298 7846732139587402343750000
...

Para más detalles, intente escribir 22222.09482en una celda y escribir 22222.0948199999(cinco nueves finales) en otra celda. Excel debe elegir los dos representantes de IEEE indicados por la flecha de arriba. Y creo que sí, porque puedes calcular la diferencia de estas dos celdas para obtener 9.82254E-11. Pero ambos se muestran de la misma manera.

Si Excel hubiera mostrado los primeros 17 dígitos, sería útil seleccionar exactamente qué número IEEE está "debajo" del número decimal. En ese caso:

22222.0948199999 --> 22222.09481 99999 00
22222.09482      --> 22222.09481 99999 98

Pero mostrar 15 dígitos redondeados de forma incorrecta es engañoso y poco útil.


Antes de que alguien afirme que es intencional, ¿por qué 8.7no muestra el mismo comportamiento? El número de doble precisión más cercano a 8.7es:

8.69999999999999 93

por lo tanto, debe mostrarse como 8.69999999999999si esto fuera intencional Pero no lo hace.

Jeppe Stig Nielsen
fuente
9
Tienes razón, es un error. Los algoritmos para convertir un número de punto flotante binario que muestra el menor número de dígitos significativos son difíciles, pero conocidos. Parece que alguien perdió algunos detalles importantes.
Mark Ransom
2
@Ruslan He visto muchos hilos en aritmética de punto flotante, en Stack Overflow y otros sitios de SE, y a menudo las personas dan una respuesta con todo tipo de verdades y nociones generales sobre el punto flotante (binario), sin relacionar los números reales y verificar si el comportamiento cumple con IEEE. Creo que podría publicar la pregunta "¿Por qué 2.1 + 2.2regresa 4.80000001?" y obtengo muchas respuestas diciendo que eso es lo que debo esperar cuando uso el punto flotante.
Jeppe Stig Nielsen
1
@benshepherd: la captura de pantalla de LibreOffice no muestra lo que muestra la captura de pantalla de Excel
Thomas Weller
1
@JeppeStigNielsen: 2.1 + 2.2 = 4.8? Eso es solo 0.5 de descuento. Es normal.
Thomas Weller
@ MarkRansom: entonces, ¿Excel realmente lo implementa por sí mismo? ¿Excel no está implementado en C ++ o algo que haga ese cálculo de coma flotante? ¿Eso es lo que estás diciendo? ¿O el error ya está en C ++, por lo que afecta a millones de aplicaciones?
Thomas Weller
22

Excel almacena números en formato binario de coma flotante IEEE 754 de 64 bits. La clave es "almacena": el cambio de decimal a binario se produce cada vez que se almacena un número, no solo cuando se usa en un cálculo real.

Un buen artículo sobre esto está en Comprender la precisión de punto flotante, también conocido como "¿Por qué Excel me da respuestas aparentemente incorrectas?"

Es posible hacer un programa de hoja de cálculo que maneje números realmente grandes con muchos dígitos significativos. Pero no es terriblemente práctico. Excel podría haber sido diseñado para usar el formato IEEE 754 decimal128 , que permite 34 dígitos decimales, más que suficiente para almacenar 22222.09482. Pero en su lugar, utiliza el formato binario64 de doble precisión , mucho más común , que tiene 53 bits de precisión, que tiene poco menos de 16 dígitos. Si bien podría pensar que sería suficiente para un número con solo 10 dígitos, la conversión de decimal a binario complica un poco las cosas, es decir, 2222209482 puede almacenarse 100% correctamente como un número binario64, pero 22222.09482 no puede.

Tenga en cuenta que, por lo general, las hojas de cálculo se utilizan para datos financieros, que generalmente no requieren tantos dígitos de precisión, o para modelar "qué pasaría si" en una variedad de escenarios, donde no se necesita un nivel de precisión súper alto. Ciertamente, hay otras herramientas (y probablemente otros programas de hojas de cálculo, pero no he buscado últimamente) que, de forma predeterminada o mediante ajustes de configuración especiales, pueden usar un formato numérico más grande, pero Excel no es uno de ellos.

Para aquellos que señalan que LibreOffice maneja esto mejor, la apariencia puede ser engañosa. Vea esta publicación para más detalles. Parece que LibreOffice maneja números grandes de manera ligeramente diferente pero tiene la misma representación básica de coma flotante de 64 bits con problemas similares.

manassehkatz-Reinstate Monica
fuente
3
Esta respuesta sería mejor si también explicara la observación de que algunos números con decimales se muestran exactamente como se ingresaron, como 11111.09482 en el ejemplo del OP.
Andrew
11
Solo por diversión: 22222.09482se almacena como 1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)en IEEE 754, o en otras palabras como exactamente 1.35632902954101553 * 2^14, que es 22222.0948199999984353787904.
YoYoYonnY
1
Binary64 (también conocido como doble precisión) es más que suficiente para un número con diez dígitos decimales. Por supuesto, no puede representarse exactamente, pero la mayoría de los números, incluidos 0.2y 0.1no pueden representarse exactamente (la fracción 1/5 (un quinto) tiene una expansión binaria recurrente infinita). Sin embargo, Excel muestra las cosas de manera confusa.
Jeppe Stig Nielsen
2
"Tenga en cuenta que, por lo general, las hojas de cálculo se usan para datos financieros, que generalmente no requieren tantos dígitos de precisión", lo que generalmente es muy incorrecto, los datos financieros requieren un comportamiento preciso en el sentido de "lo que escribe es lo que espera que permanezca allí". ", ¡Tienes razón con la conversión decimal / binaria, etc., pero este argumento en particular no es válido! Para los datos financieros que suelen utilizar algún tipo de Moneyo BigIntegerformato, que utiliza a menudo decimal formato de almacenamiento.
Honza Zidek
44
Esta respuesta no es suficiente para explicar lo que sucede. Estamos observando un error en Excel, donde el número está formateado incorrectamente . 22222.09482 y 22222.0948199999 son números binarios64 distintos.
Ruslan
11

Al hacer sus cálculos, Excel necesita encontrar una buena representación binaria interna para los números que usa. En su caso, utiliza un número de coma flotante y, de hecho, este formato de datos tiene una aproximación (muy buena) para su número, pero no coincide exactamente. Entonces, si no le dice explícitamente a Excel qué formato de salida usar, hará un "mejor esfuerzo", resultando en una salida más cercana al valor calculado internamente, pero no es exactamente el texto que ingresa.

Solo para aclarar esto: entender que el texto que ingresó representa un número y convertir la secuencia de dígitos en un número ya cumple con la definición de "cálculo" de arriba.

EDITAR

No he dejado lo suficientemente claro, que considero que la opción de usar una representación de coma flotante de 64 bits es realmente buena: Excel no es una herramienta para científicos, donde un error de redondeo en el undécimo dígito después del punto decimal hace un gran impacto, pero los contadores no quieren que su velocidad de procesamiento se reduzca en un factor de millones para acomodar una fuente de cálculo inexacto que podría manifestarse en números que nunca usan.

Si utiliza un programa de hoja de cálculo para el que fue diseñado y utiliza un formato de salida explícito para asegurarse de que esos efectos nunca lleguen al reino visible, estará bien.

Eugen Rieck
fuente
1
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
DavidPostill
1
Esta respuesta no es suficiente para explicar lo que sucede. Estamos observando un error en Excel, donde el número está formateado incorrectamente. 22222.09482 y 22222.0948199999 son números binarios64 distintos.
Ruslan
2

Cuando entro 11111.09482 y 66666.09482, 77777.09482 .. hasta 99999.09482, entonces se muestran correctamente. No estoy seguro de si esto está relacionado con el redondeo. No configuré ningún perfil de redondeo. ¿Podría por favor ayudarme a resolver el problema?

Algunos números se pueden representar correctamente y otros no.

Establezca la precisión que se muestra adecuadamente para sus cálculos y use la función round () .

  • Explicación:

  • Solución:

    Con frecuencia, puede evitar que los errores de redondeo de coma flotante afecten su trabajo configurando la opción Precisión como se muestra antes de aplicar un formato de número a sus datos. Esta opción fuerza el valor de cada número en la hoja de trabajo a la precisión que se muestra en la hoja de trabajo.

    1. Haga clic en Archivo> Opciones.
      En Excel 2007: haga clic en el botón de Microsoft Office Imagen del botón de Office y luego haga clic en Opciones de Excel.
      Imagen de botón

    2. Haga clic en Avanzado y luego en Al calcular este libro, seleccione la casilla de verificación Establecer precisión como se muestra y luego haga clic en Aceptar.

    3. Haga clic en Aceptar.

    4. En la hoja de trabajo, seleccione las celdas que desea formatear.

    5. En la pestaña Inicio, haga clic en la imagen del Botón de inicio del cuadro de diálogo junto a Número.
      Imagen del botón de inicio
      Imagen de cinta de Excel

    6. En el cuadro Categoría, haga clic en Número.

    7. En el cuadro Lugares decimales, ingrese el número de lugares decimales que desea mostrar.

    Sugerencia: Para minimizar los efectos de la inexactitud del almacenamiento aritmético de coma flotante, también puede usar la función REDONDEAR para redondear los números al número de decimales que requiere su cálculo.

  • Journal of Accountancy - " Error por errores de cálculo de Excel ":

    Ciertos números impares crean decimales binarios repetidos, y cuando esos dígitos repetidos se cortan después de 15 lugares, el número binario no se convierte de nuevo con precisión al valor numérico deseado. Como ejemplo, en todas las ediciones de Excel, la fórmula 22.26 - 21.29 debería producir 0.97, pero en cambio arroja 0.970000000000002. Pruébelo y recuerde aumentar el ancho de la columna y los lugares decimales para que pueda ver el problema de cálculo.

    Tales errores generalmente se consideran insignificantes o inmateriales porque rara vez se manifiestan en errores de cálculo significativos; No obstante, aquí hay dos medidas que puede tomar para eliminar posibles errores de coma decimal flotante:

    1. La función REDONDA. Use la función REDONDEAR de Excel para redondear los valores calculados al lugar decimal deseado, eliminando así cualquier posibilidad de anomalías de 15 dígitos. Por ejemplo, la fórmula = REDONDA (-21.29 + 22.26,2) produce con precisión 0.97.

    2. Precisión. Puede activar la opción Precisión como se muestra de Excel para forzar a todas las fórmulas a truncar y redondear los valores calculados en función de los dígitos visibles.

    Para activar esta opción en Excel 2013, 2010 y 2007, seleccione Archivo (u Office Orb), Opciones (u Opciones de Excel), Avanzado y, en la sección Al calcular este libro, marque la casilla Establecer precisión como se muestra, y luego haga clic en Aceptar.

    En Excel 2003, 2002 y 2000, en el menú Herramientas, seleccione Opciones y, en la pestaña Cálculo, en Opciones del libro, marque la casilla Precisión como se muestra y luego haga clic en Aceptar.

Robar
fuente
1
La explicación es irrelevante: la diferencia entre los números esperados y los obtenidos es 28 ULP, demasiado para un error de redondeo natural. La "solución" simplemente esconde un error real.
Ruslan
Sería genial si pudiera publicar eso, junto con algunos enlaces que respaldan su respuesta, como su propia respuesta en lugar de un comentario. De esa forma, llamaría la atención del usuario 954171 y la gente podría votarlo. ¿Puede proporcionar un enlace al Informe de errores?
Rob el
Ya hay una respuesta con todos los detalles matemáticos relevantes. Sin embargo, no sé de ningún informe de error sobre esto.
Ruslan
0

Como estoy seguro de que sabe, las computadoras funcionan internamente solo usando ceros y unos (también conocidos como bits) y tienen un número fijo de bits para representar un valor (generalmente 64 bits hoy en día). Eso significa que el número de valores diferentes que se pueden representar es de 2 a la 64ª potencia. Es un número enorme, claro, pero el número de valores posibles es finito, por lo que no todos los números pueden representarse. Cuando encuentra un número que no puede representar exactamente, se reemplaza automáticamente por el más cercano que puede representar. Eso es lo que estás viendo.

Javier Alvarado
fuente
¿Está diciendo que se debe a la conversión de la base de números o a una cantidad limitada de memoria por valor? En ambos casos, su razonamiento es incorrecto. Técnicamente, es perfectamente posible tener precisión arbitraria y números de longitud arbitraria, suponiendo una memoria infinita. Para dar un ejemplo, hay GNU bignum. Además, no hay necesidad inherente de codificar números en un formato con pérdida. Entonces, tampoco es culpa de la informática, ni los números binarios. Solo los desarrolladores de Excel eligieron una codificación de número que es una entrada de usuario con pérdida de wrt.
phresnel
-1

Las computadoras hacen sus cálculos en binario y casi siempre usan coma flotante para valores no enteros. Los únicos valores fraccionarios que pueden representarse con precisión en coma flotante deben ser una suma de alguna combinación de potencias fraccionarias de terminación 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) en el límite de precisión diseñado (generalmente 53 bits). Estos valores no siempre tienen una representación ordenada o exacta en decimal, y por el contrario, no todos los valores fraccionarios que puede representar exactamente en decimal tendrán una representación exacta en binario. Por ejemplo: 0.1. No se puede representar como una suma de potencias fraccionarias de 2 que no dura para siempre.

Cuando ingresa un valor decimal en su hoja de cálculo, se convertirá y almacenará en binario, y los casos como los que describió se convertirán en la aproximación más cercana que se puede representar en binario. Cuando se muestra, se convierte de nuevo a decimal, lo que nuevamente requiere una aproximación, que podría no volver a convertirse exactamente en la misma representación que ingresó.

¿Por qué 53 bits (más o menos)? Debido a que el estándar típico para almacenar el punto flotante de "doble precisión" utiliza 64 bits, en el que hay una mantisa (también llamada significado), un indicador de signo y un exponente. Al exponente generalmente se le asignan 10 bits, el signo toma uno, dejando 53 para la mantisa. Esto es para el almacenamiento. Los cálculos generalmente se realizan con 80 bits y se redondean de nuevo.

Hay situaciones en las que las computadoras funcionarán en la base 10, especialmente cuando se trabaja con valores monetarios donde los artefactos de redondeo no son aceptables.

Zenilogix
fuente
2
No estoy de acuerdo con una declaración general de Todas las computadoras . Había muchas computadoras, la mayoría ya no se usaban activamente, excepto como piezas de museo, que usaban formatos numéricos decimales para el almacenamiento y los cálculos. También hay BCD (decimal codificado en binario) que se usa en varias CPU más recientes, incluido el uso limitado en las CPU Intel. Nada de eso es relevante para la pregunta en cuestión: el método utilizado por Microsoft Excel para almacenar números, que es todo binario. Pero "Todas las computadoras" no es correcto.
manassehkatz-Reinstate Monica
Veo el cambio de "Todas las computadoras" a "Computadoras": iría con "Casi todas las computadoras" o "La mayoría de las computadoras modernas" o algo así. Lo sé, soy exigente. Pero también lo son las computadoras :-)
manassehkatz-Reinstate Monica
@manassehkatz Todas las computadoras digitales son fundamentalmente binarias. BCD es solo una estructura de base 10 sobre binario para facilitar la aritmética decimal.
Zenilogix
Si bien todas las computadoras digitales son fundamentalmente binarias, en realidad hubo bastantes en los primeros días que estaban basadas en decimales. Pero estoy de acuerdo en que BCD es esencialmente una estructura de base 10 sobre binario para facilitar la aritmética decimal.
manassehkatz-Reinstate Monica
Esta respuesta suena como si fuera culpa de la computadora. Pero no lo es. Puede representar cualquier número con precisión, podría escribir en papel (¿representa 1/3 exactamente? Fácil cuando se almacena como fracción, por ejemplo). Realmente se trata de qué representación eligieron los autores de Excel para representar los números.
phresnel
-1

Como muchos han dicho anteriormente, este es un error de representación interna. Excel ha elegido números de coma flotante de 64 bits y doble precisión. Esto le da 2 64 valores posibles. El dominio de números reales contiene una infinidad de valores, por lo que cuando intente usar uno que no pueda ser representado por Excel, usará el más cercano que pueda ser representado.

He visto comentarios que dicen que, dada la memoria infinita, se puede representar cualquier número real. Es cierto, pero no existe la "memoria infinita", por lo que este es un punto discutible. Otros han declarado que Excel podría haber utilizado una representación interna más grande, por ejemplo, 128 bits. Es cierto, pero resulta que las computadoras son mejores para realizar operaciones matemáticas en números representados con el número de bits que coincide con el tamaño del bus del procesador. Por lo tanto, una computadora de 32 bits será más rápida en operaciones matemáticas con números de 32 bits y una computadora de 64 bits será más rápida en operaciones matemáticas con números de 64 bits. Si y cuando habrá una computadora de 128 bits, podemos esperar que Excel se mueva a una representación de números de 128 bits. Eso todavía proporcionará un conjunto muy grande pero limitado de números que se pueden representar.

Si le preocupa cómo se ven los números en la hoja de cálculo, el uso de una precisión establecida (número de decimales) le dará resultados consistentes. Si le preocupa la diferencia entre el número que escribe y el número real almacenado por Excel, tiene razón en preocuparse. La diferencia es real y el error se llevará a cabo a través de los cálculos que realice. Me temo que estás atrapado con este error. Esta es una limitación de Excel, no un error como algunos han dicho. No es probable que cambie pronto, por lo que si no es aceptable para usted, le sugiero que busque otra aplicación de hoja de cálculo que pueda representar números con mayor precisión. Pero tenga en cuenta que si encuentra alguna de estas aplicaciones, la limitación sigue ahí. Es solo el tamaño del error lo que es diferente.

Tibi
fuente