In Excel, quando inserisco 22222.09482, vedo il numero 22222.0948199999 nella barra della formula


28

Potresti per favore aiutare - dato che ho una strana situazione in cui quando inserisco un numero 22222.09482 nella cella, vedo un numero diverso 22222.0948199999 nella barra della formula. Di seguito è riportato l'istantanea del problema.

Errore di esempio

Vedo lo stesso comportamento quando inserisco i seguenti numeri:

22222.09482
33333.09482
44444.09482
55555.09482

ma quando inserisco 11111.09482 e 66666.09482, 77777.09482 .. fino al 99999.09482, vengono visualizzati correttamente. Non sono sicuro che sia correlato all'arrotondamento? Non ho impostato alcun profilo di arrotondamento. La prego di aiutarmi a risolvere il problema.


1
Trova pulito, fa lo stesso per me - puoi semplicemente usare ROUND()? =ROUND(A1,5), quindi copia / incolla i dati come valori e rimuovi i numeri originali?
BruceWayne,

1
@BruceWayne, è interessante notare che ROUND()mostra le cifre corrette ma il copia / incolla come valore lo riporta al problema originale!
Rey Juna,

1
@ReyJuna - Quindi ripeti ROUND(A1,5)sui valori incollati. Quindi copia / incolla quelli come valori e Round(), di nuovo, quindi copia / incolla. ...: P ... è interessante, e sembra che @EugenRieck abbia il ragionamento. Bella domanda!
BruceWayne,

1
Ti interessa davvero la differenza tra 22222.09482 e 22222.0948199999? È una differenza di 5 parti in 100 trilioni.
Russell Borogove,

4
La matematica in virgola mobile è rotta? . Tuttavia è probabilmente un bug, poiché doubleha una precisione sufficiente che quando arrotondato mostra i valori corretti come la maggior parte della gente si aspettava
phuclv

Risposte:


31

È un bug.

Excel utilizza la consueta rappresentazione IEEE a doppia precisione, secondo altre risposte. La sua precisione è di 53 cifre binarie significative, che corrispondono a circa 16 cifre decimali.

È sempre "sicuro" visualizzare le prime 15 cifre decimali significative. Nel senso che qualsiasi numero decimale "presentato" dato con 15 cifre può essere tranquillamente distinto dai numeri ottenuti cambiando la cifra del 15 decimale di uno. Ad esempio, i numeri a 15 cifre:

22222.09481 99999
22222.09482 00000
22222.09482 00001

mappare su tre numeri distinti a doppia precisione. Nessuno di questi tre sarà "vicino" nella rappresentazione a doppia precisione, in questo caso particolare.

Quindi, confondere i primi due nel display dell'utente, è un bug di Excel.

In effetti, in questo dominio (tra il 16384 e 32768), la precisione assoluta è 2 -38 e sono rappresentabili i seguenti numeri:

...
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
...

Per elaborare ulteriormente, prova a digitare 22222.09482in una cella e a digitare 22222.0948199999(cinque nove finali) in un'altra cella. Excel dovrebbe selezionare i due rappresentanti IEEE indicati dalla freccia sopra. E penso di sì, perché puoi calcolare la differenza di queste due celle per ottenere 9.82254E-11. Ma entrambi sono mostrati allo stesso modo.

Se Excel avesse mostrato le prime 17 cifre, sarebbe utile individuare esattamente quale numero IEEE è "sotto" il numero decimale. In quel caso:

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

Ma mostrare 15 cifre arrotondate in modo errato è fuorviante e inutile.


Prima che qualcuno affermi che è intenzionale, allora perché 8.7non mostra lo stesso comportamento? Il numero di doppia precisione più vicino a 8.7è:

8.69999999999999 93

quindi dovrebbe mostrare come 8.69999999999999se fosse intenzionale. Ma non lo fa.


9
Hai ragione, è un bug. Gli algoritmi per convertire un numero binario in virgola mobile che visualizza il minor numero di cifre significative sono difficili, ma noti. Sembra che qualcuno abbia perso alcuni dettagli importanti.
Mark Ransom,

2
@Ruslan Ho visto molti thread sull'aritmetica in virgola mobile, su Stack Overflow e altri siti SE, e spesso le persone danno una risposta con tutti i tipi di verità e nozioni generali sul punto mobile (binario), senza fare riferimento ai numeri reali e verificare se il comportamento è conforme IEEE. Penso di poter pubblicare la domanda "Perché 2.1 + 2.2ritorna 4.80000001?" e ottenere molte risposte dicendo che è quello che devo aspettarmi quando uso il virgola mobile.
Jeppe Stig Nielsen,

1
@benshepherd: lo screenshot di LibreOffice non mostra ciò che mostra lo screenshot di Excel
Thomas Weller,

1
@JeppeStigNielsen: 2.1 + 2.2 = 4.8? Questo è solo 0,5 di sconto. È normale.
Thomas Weller,

@MarkRansom: così Excel lo implementa davvero da solo? Excel non è implementato in C ++ o qualcosa che fa quel calcolo in virgola mobile per esso? È quello che stai dicendo? O il bug è già in C ++, quindi interessa milioni di applicazioni?
Thomas Weller,

22

Excel memorizza i numeri in formato binario IEEE 754 a virgola mobile a 64 bit. La chiave è "negozi": il passaggio da decimale a binario avviene ogni volta che viene memorizzato un numero, non solo quando viene utilizzato in un calcolo effettivo.

Un bell'articolo su questo argomento è Comprensione della precisione in virgola mobile, alias "Perché Excel mi dà risposte apparentemente sbagliate?"

È possibile creare un programma per fogli di calcolo che gestisca numeri veramente grandi con molte cifre significative. Ma non è terribilmente pratico. Excel avrebbe potuto essere progettato per utilizzare il formato decimale128 IEEE 754 , che consente 34 cifre decimali, più che sufficienti per memorizzare 22222.09482. Ma invece utilizza il formato binario64 Double Precision molto più comune , che ha 53 bit di precisione, che è poco meno di 16 cifre. Mentre potresti pensare che sarebbe sufficiente per un numero con solo 10 cifre al suo interno, la conversione da decimale a binario complica un po 'le cose - cioè, 2222209482 può essere memorizzato correttamente al 100% come numero binario64, ma 22222.09482 non può.

Tieni presente che in genere i fogli di calcolo vengono utilizzati per dati finanziari, che in genere non richiedono così tante cifre di precisione o per la modellazione "what if" in una varietà di scenari, in cui non è necessario un livello di precisione altissimo. Esistono sicuramente altri strumenti (e probabilmente altri programmi per fogli di calcolo, ma non ho cercato di recente) che per impostazione predefinita o con impostazioni di configurazione speciali possono utilizzare un formato numerico più grande, ma Excel non è uno di questi.

Per coloro che sottolineano che LibreOffice lo gestisce meglio, l'aspetto può essere ingannevole. Vedi questo post per maggiori dettagli. Sembra che LibreOffice gestisca grandi numeri in modo leggermente diverso ma abbia la stessa rappresentazione di base a virgola mobile a 64 bit con problemi simili.


3
Questa risposta sarebbe migliore se spiegasse anche l'osservazione che alcuni numeri con decimali sono mostrati esattamente come inseriti - come 11111.09482 nell'esempio del PO.
Andrew

11
Solo per divertimento: 22222.09482è memorizzato come 1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)in IEEE 754, o in altre parole esattamente 1.35632902954101553 * 2^14, che è 22222.0948199999984353787904.
YoYoYonnY,

1
Binary64 (aka doppia precisione) è più che sufficiente per un numero con dieci cifre decimali. Naturalmente non può essere rappresentato esattamente, ma la maggior parte dei numeri, inclusi 0.2e 0.1non possono essere rappresentati esattamente (la frazione 1/5 (un quinto) ha un'espansione binaria ricorrente infinita). Tuttavia, Excel mostra le cose in modo confuso.
Jeppe Stig Nielsen,

2
"Tieni presente che in genere i fogli di calcolo vengono utilizzati per i dati finanziari, che in genere non richiedono così tante cifre di precisione" - questo è generalmente molto sbagliato - i dati finanziari richiedono un comportamento preciso nel senso "ciò che digiti è ciò che ti aspetti rimarrà lì ", Hai ragione con la conversione decimale / binaria ecc., Ma questo particolare argomento non è valido! Per i dati finanziari di solito utilizziamo un tipo Moneyo un BigIntegerformato, che spesso utilizza un formato di archiviazione decimale .
Honza Zidek,

4
Questa risposta non è sufficiente per spiegare cosa succede. Stiamo osservando un bug in Excel, in cui il numero è formattato in modo errato . 22222.09482 e 22222.0948199999 sono numeri binari64 distinti.
Ruslan,

11

Quando esegue i calcoli, Excel deve trovare una buona rappresentazione binaria interna per i numeri che utilizza. Nel tuo caso, utilizza un numero in virgola mobile e, di fatto, questo formato di dati ha un'approssimazione (molto buona) per il tuo numero, ma nessuna corrispondenza esatta. Quindi, se non si dice esplicitamente a Excel quale formato di output utilizzare, farà uno "sforzo migliore", dando come risultato un output più vicino al valore calcolato internamente, ma non esattamente il testo inserito.

Giusto per chiarire questo: capire che il testo inserito rappresenta un numero e convertire la sequenza di cifre in un numero soddisfa già la definizione di "calcolo" dall'alto.

MODIFICARE

Non ho chiarito abbastanza bene, che considero la scelta di utilizzare una rappresentazione a virgola mobile a 64 bit in realtà una buona: Excel non è un attrezzo come strumento per gli scienziati, dove si verifica un errore di arrotondamento nell'undicesima cifra dopo la virgola un grande impatto, ma i contabili non vogliono che la loro velocità di elaborazione sia ridotta di un fattore di milioni per accogliere una fonte di calcolo inesatto che potrebbe manifestarsi in numeri che non usano mai.

Se usi un programma per fogli di calcolo per quello per cui è stato progettato e usi la formattazione esplicita dell'output per assicurarti che quegli effetti non arrivino mai nel regno visibile, starai bene.


1
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DavidPostill

1
Questa risposta non è sufficiente per spiegare cosa succede. Stiamo osservando un bug in Excel, in cui il numero è formattato in modo errato. 22222.09482 e 22222.0948199999 sono numeri binari64 distinti.
Ruslan,

2

Quando inserisco 11111.09482 e 66666.09482, 77777.09482 .. fino al 99999.09482, vengono visualizzati correttamente. Non sono sicuro che sia correlato all'arrotondamento? Non ho impostato alcun profilo di arrotondamento. La prego di aiutarmi a risolvere il problema.

Alcuni numeri possono essere rappresentati correttamente e altri no.

Impostare la precisione visualizzata in modo appropriato per i calcoli e utilizzare la funzione round () .

  • Spiegazione:

  • Soluzione:

    È spesso possibile impedire che gli errori di arrotondamento in virgola mobile influiscano sul lavoro impostando l'opzione Precisione come visualizzato prima di applicare un formato numerico ai dati. Questa opzione impone che il valore di ciascun numero nel foglio di lavoro sia nella precisione visualizzata sul foglio di lavoro.

    1. Fai clic su File> Opzioni.
      In Excel 2007: fare clic sull'immagine del pulsante Microsoft Office Button Office, quindi su Opzioni di Excel.
      Immagine del pulsante

    2. Fare clic su Avanzate, quindi in Quando si calcola questa cartella di lavoro, selezionare la casella di controllo Imposta precisione come visualizzata, quindi fare clic su OK.

    3. Clicca OK.

    4. Nel foglio di lavoro, seleziona le celle che desideri formattare.

    5. Nella scheda Home, fai clic sull'immagine del pulsante di avvio della finestra di dialogo accanto a Numero.
      Immagine del pulsante di avvio
      Immagine del nastro Excel

    6. Nella casella categoria, fare clic su numero.

    7. Nella casella Posizioni decimali, immettere il numero di posizioni decimali che si desidera visualizzare.

    Suggerimento: per ridurre al minimo gli effetti dell'imprecisione della memoria aritmetica in virgola mobile, è anche possibile utilizzare la funzione ROUND per arrotondare i numeri al numero di posizioni decimali richiesto dal calcolo.

  • Journal of Accountancy - " Bugged by errori di calcolo di Excel ":

    Alcuni numeri dispari creano decimali binari ripetuti e quando quelle cifre ripetute vengono tagliate dopo 15 posizioni, il numero binario non viene convertito in modo accurato nel valore numerico desiderato. Ad esempio, in tutte le edizioni di Excel, la formula 22.26 - 21.29 dovrebbe produrre 0.97, ma invece produce 0.970000000000002. Provalo e ricorda di aumentare la larghezza della colonna e le posizioni decimali in modo da poter vedere il problema di calcolo.

    Tali errori sono generalmente considerati insignificanti o irrilevanti perché raramente si manifestano in errori di calcolo significativi; tuttavia, ecco due misure che è possibile adottare per eliminare potenziali errori in virgola mobile:

    1. La funzione ROUND. Utilizzare la funzione ROUND di Excel per arrotondare i valori calcolati alla posizione decimale desiderata, eliminando così qualsiasi possibilità di anomalie di 15 cifre. Ad esempio, la formula = ROUND (-21.29 + 22.26,2) produce accuratamente 0,97.

    2. Precisione. È possibile attivare l'opzione Precisione come visualizzata di Excel per forzare tutte le formule a troncare e arrotondare i valori calcolati in base alle cifre visibili.

    Per attivare questa opzione in Excel 2013, 2010 e 2007, selezionare File (o il globo di Office), Opzioni (o Opzioni di Excel), Avanzate e nella sezione Quando si calcola questa cartella di lavoro, selezionare la casella Imposta precisione come visualizzata e quindi fare clic su OK.

    In Excel 2003, 2002 e 2000, dal menu Strumenti, selezionare Opzioni e nella scheda Calcolo, in Opzioni cartella di lavoro, selezionare la casella Precisione come visualizzata, quindi fare clic su OK.


1
La spiegazione è irrilevante: la differenza tra i numeri previsti e quelli ottenuti è 28 ULP - troppo per errore di arrotondamento naturale. La "soluzione" nasconde solo un vero bug.
Ruslan,

Sarebbe bello se tu potessi postare questo, insieme ad alcuni link che supportano la tua risposta, come la tua risposta invece di un commento. In questo modo verrebbe a conoscenza dell'utente954171 e le persone potrebbero votare al riguardo. Potete fornire un link al bug report?
Rob,

Esiste già una risposta con tutti i dettagli matematici pertinenti. Non so se ci siano segnalazioni di bug al riguardo.
Ruslan,

0

Come sicuramente sai, i computer lavorano internamente solo usando zeri e uno (aka bit) e hanno un numero fisso di bit per rappresentare un valore (di solito 64 bit al giorno d'oggi). Ciò significa che il numero di diversi valori che possono essere rappresentati è 2 alla 64a potenza. È un numero enorme, certo, ma il numero di valori possibili è finito, quindi non tutti i numeri possono essere rappresentati. Quando incontra un numero che non può rappresentare esattamente, viene automaticamente sostituito da quello più vicino che può rappresentare. Questo è quello che stai vedendo.


Stai affermando che è a causa della conversione della base numerica o della quantità limitata di memoria per valore? In entrambi i casi, il tuo ragionamento è sbagliato. Tecnicamente, è perfettamente possibile avere precisione e numeri di lunghezza arbitrari - assumendo memoria infinita. Per fare un esempio, c'è GNU bignum. Inoltre, non è necessario intrinsecamente codificare i numeri in un formato con perdita. Quindi non è colpa né dell'informatica, né dei numeri binari. Sono solo gli sviluppatori di Excel che hanno scelto una codifica numerica che è l'input dell'utente con perdita di dati.
galleria

-1

I computer fanno i loro calcoli in binario e quasi sempre usano il virgola mobile per valori non interi. Gli unici valori frazionari che possono essere rappresentati precisamente in virgola mobile devono essere una somma di una combinazione di potenze frazionarie di 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) che terminano al limite di precisione progettato (di solito 53 bit). Questi valori non hanno sempre una rappresentazione ordinata o esatta in decimale e, al contrario, non tutti i valori frazionari che puoi rappresentare esattamente in decimale avranno una rappresentazione esatta in binario. Ad esempio: 0.1. Non può essere rappresentato come una somma di poteri frazionari di 2 che non va avanti per sempre.

Quando inserisci un valore decimale nel foglio di calcolo, questo verrà convertito e memorizzato in binario e i casi come quello descritto diventeranno l'approssimazione più vicina che può essere rappresentata in binario. Quando visualizzato, viene convertito nuovamente in decimale, richiedendo nuovamente un'approssimazione, che potrebbe non essere convertita esattamente nella stessa rappresentazione immessa.

Perché 53 bit (dare o avere)? Perché lo standard tipico per la memorizzazione in virgola mobile di "doppia precisione" utilizza 64 bit, in cui vi è una mantissa (chiamata anche significando), un indicatore di segno e un esponente. All'esponente di solito sono assegnati 10 bit, il segno ne prende uno, lasciando 53 per la mantissa. Questo è per l'archiviazione. I calcoli vengono generalmente eseguiti utilizzando 80 bit e il dorso arrotondato.

Ci sono situazioni in cui i computer funzioneranno nella base 10, specialmente quando si lavora con valori monetari in cui gli artefatti di arrotondamento non sono accettabili.


2
Non sono d'accordo con una coperta Dichiarazione di tutti i computer . C'erano molti computer, la maggior parte dei quali non era più in uso attivo, tranne come pezzi da museo, che utilizzavano formati numerici decimali per l'archiviazione e i calcoli. Esistono anche BCD - Decimali con codice binario - utilizzati in un numero di CPU più recenti, incluso un uso limitato nelle CPU Intel. Niente di tutto ciò è rilevante per la domanda a portata di mano: il metodo utilizzato da Microsoft Excel per memorizzare i numeri, che è tutto binario. Ma "Tutti i computer" non è corretto.
manassehkatz-Reinstate Monica,

Vedo il passaggio da "Tutti i computer" a "Computer": sceglierei "Quasi tutti i computer" o "Computer più moderni" o qualcosa del genere. Lo so - sono esigente. Ma anche i computer :-)
manassehkatz-Reinstate Monica,

@manassehkatz Tutti i computer digitali sono fondamentalmente binari. BCD è solo una struttura di base 10 in cima al binario per facilitare l'aritmetica decimale.
Zenilogix,

Mentre tutti i computer digitali sono fondamentalmente binari, all'inizio ce n'erano parecchi basati su decimali. Ma sono d'accordo sul fatto che BCD sia essenzialmente una struttura di base 10 in cima al binario per facilitare l'aritmetica decimale.
manassehkatz-Reinstate Monica,

Questa risposta suona come se fosse colpa del computer. Ma non lo è. Puoi rappresentare qualsiasi numero con precisione che potresti scrivere su carta (rappresentano 1/3 esattamente? Facile quando lo memorizzi come frazione, ad esempio). Si tratta davvero di quale rappresentazione gli autori di Excel hanno scelto per rappresentare i numeri.
galleria

-1

Come molti hanno già detto, questo è un errore di rappresentazione interna. Excel ha fatto la scelta per numeri a virgola mobile a 64 bit a doppia precisione. Questo ti dà 2 64 possibili valori. Il dominio dei numeri reali contiene un'infinità di valori, quindi quando si tenta di utilizzare uno che non può essere rappresentato da Excel, utilizzerà il più vicino che può essere rappresentato.

Ho visto commenti che affermano che, data la memoria infinita, è possibile rappresentare qualsiasi numero reale. È vero, ma non esiste una "memoria infinita", quindi questo è un punto controverso. Altri hanno affermato che Excel avrebbe potuto utilizzare una rappresentazione interna più ampia, ad esempio 128 bit. È vero, ma risulta che i computer sono più bravi a fare operazioni matematiche su numeri rappresentati con il numero di bit che corrisponde alla dimensione del bus del processore. Quindi un computer a 32 bit sarà il più veloce nelle operazioni matematiche su numeri a 32 bit e un computer a 64 bit sarà il più veloce nelle operazioni matematiche su numeri a 64 bit. Se e quando ci sarà un computer a 128 bit, possiamo aspettarci che Excel passi alla rappresentazione del numero a 128 bit. Ciò fornirà comunque un numero molto grande ma limitato di numeri che possono essere rappresentati.

Se la tua preoccupazione riguarda l'aspetto dei numeri nel foglio di calcolo, l'utilizzo di una precisione impostata (numero di decimali) ti darà risultati coerenti. Se ti preoccupi della differenza tra il numero digitato e il numero effettivo memorizzato da Excel, hai ragione a essere preoccupato. La differenza è reale e l'errore verrà portato avanti attraverso tutti i calcoli effettuati. Temo che tu sia bloccato con questo errore. Questa è una limitazione di Excel, non un bug come alcuni hanno affermato. È improbabile che cambi presto in qualsiasi momento, quindi se non è accettabile per te, ti suggerisco di cercare un'altra applicazione per fogli di calcolo che possa rappresentare numeri con maggiore precisione. Ma tieni presente che se dovessi trovare una tale applicazione, la limitazione è ancora lì. È solo la dimensione dell'errore che è diversa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.