Quando si converte un Doppio di precisione "alto" in un decimale, perdo la precisione con Convert.ToDecimal o il cast verso (Decimale) a causa di Arrotondamento.Da Doppio a Decimale senza arrotondamento dopo 15 cifre
Esempio:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
Il valore decimale restituito da Convert.ToDecimal (doppio) contiene un massimo di 15 cifre significative. Se il parametro value contiene più di 15 cifre significative, viene arrotondato con arrotondamento al più vicino.
Così, al fine di mantenere la mia precisione, devo convertire il mio doppio in una stringa e quindi chiamare Convert.ToDecimal (String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
Questo metodo funziona, ma vorrei evitare di usare una variabile String per convertire un valore da doppio a decimale senza arrotondamento dopo 15 cifre?
Conoscete in anticipo la gamma per 'd'? Posso offrire alcune soluzioni leggere in pseudocodice (non sono abbastanza familiare con C# per scriverle in C#) se sai che 'd' è in un intervallo come [-2..2] –
d sarà sempre tra [- 1,1] –
Suppongo che questo sia un "doppio" proveniente da qualcos'altro che non puoi cambiare? Se è dichiarato decimale dal get-go ('decimal d = -0.99999999999999956m;') mantiene tale precisione. –