Condividi tramite


Numeri a virgola mobile

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

In questo argomento vengono descritti alcuni dei problemi che gli sviluppatori incontrano spesso quando usano i numeri a virgola mobile nel provider di dati Microsoft SqlClient per SQL Server. Questi problemi sono dovuti al modo in cui i computer archiviano i numeri a virgola mobile e non sono specifici di un determinato provider, ad esempio Microsoft.Data.SqlClient.

Pitfall a virgola mobile

I numeri a virgola mobile in genere non hanno una rappresentazione binaria esatta Al contrario, il computer archivia un'approssimazione del numero. In momenti differenti è possibile che vengano usati numeri diversi di cifre binarie per rappresentare il numero. Quando un numero a virgola mobile viene convertito da una rappresentazione a un'altra, le cifre meno significative di tale numero possono variare leggermente. La conversione si verifica un genere quando viene eseguito il cast di un numero da un tipo a un altro. La variazione si verifica se la conversione avviene all'interno di un database, tra tipi che rappresentano valori del database oppure tra tipi. A causa di queste modifiche, i numeri che logicamente sarebbero uguali potrebbero presentare modifiche nelle cifre meno significative, generando in questo modo valori diversi. Il numero di cifre di precisione nel numero può essere maggiore o minore del previsto. Quando viene formattato come stringa, il numero potrebbe non presentare il valore previsto.

Soluzioni alternative suggerite

Per minimizzare questi effetti, è necessario usare la corrispondenza più vicina disponibile tra tipi numerici. Se ad esempio si usa SQL Server, il valore numerico esatto può variare se si converte un valore Transact-SQL di tipo reale in un valore di tipo float. In .NET anche la conversione di Single in Double può produrre risultati imprevisti. In entrambi questi casi, una strategia efficace consiste nel fare in modo che tutti i valori dell'applicazione utilizzino lo stesso tipo numerico. È anche possibile usare un tipo decimale a precisione fissa o eseguire il cast dei numeri a virgola mobile in un tipo decimale a precisione fissa prima di usarli.

Per risolvere i problemi con il confronto di uguaglianza, è consigliabile scrivere il codice dell'applicazione in modo che le variazioni delle cifre meno significative vengano ignorate. Ad esempio, anziché eseguire un confronto per verificare l'uguaglianza tra due numeri, sottrarre un numero dall'altro. Se la differenza rientra in un margine accettabile di arrotondamento, l'applicazione può considerare i numeri come se fossero identici.

Vedi anche