Flyttalsnummer
Det här avsnittet beskriver några av de problem som utvecklare ofta stöter på när de arbetar med flyttalsnummer i ADO.NET. Dessa problem orsakas av hur datorer lagrar flyttalsnummer och inte är specifika för en viss provider, till exempel System.Data.SqlClient eller System.Data.OracleClient.
Flyttalsnummer har vanligtvis ingen exakt binär representation. I stället lagrar datorn en uppskattning av talet. Vid olika tidpunkter kan olika antal binära siffror användas för att representera talet. När ett flyttalsnummer konverteras från en representation till en annan kan de minst signifikanta siffrorna för det talet variera något. Konvertering sker vanligtvis när talet gjuts från en typ till en annan typ. Varianten inträffar oavsett om konverteringen sker i en databas, mellan typer som representerar databasvärden eller mellan typer. På grund av dessa ändringar kan tal som logiskt sett är lika med ha ändringar i de minst signifikanta siffrorna som gör att de har olika värden. Antalet siffror med precision i talet kan vara större eller mindre än förväntat. När det formateras som en sträng kanske talet inte visar det förväntade värdet.
För att minimera dessa effekter bör du använda den närmaste matchningen mellan numeriska typer som är tillgängliga för dig. Om du till exempel arbetar med SQL Server kan det exakta numeriska värdet ändras om du konverterar ett Transact-SQL-värde av verklig typ till ett värde av flyttaltyp. I .NET Framework kan konvertering av en Single till en Double också ge oväntade resultat. I båda dessa fall är en bra strategi att göra så att alla värden i programmet använder samma numeriska typ. Du kan också använda en decimaltyp med fast precision eller omvandla flyttalsnummer till en decimaltyp med fast precision innan du arbetar med dem.
Om du vill undvika problem med likhetsjämförelse bör du överväga att koda programmet så att variationer i de minst signifikanta siffrorna ignoreras. I stället för att till exempel jämföra för att se om två tal är lika subtraherar du ett tal från det andra talet. Om skillnaden ligger inom en acceptabel avrundningsmarginal kan ditt program behandla talen som om de vore desamma.