Podczas konwertowania "wysokiej" precyzji z podwójnej na dziesiętną tracę precyzję z Konwertuj.Tabela dziesiętna lub Odlewanie do (Dziesiętna) z powodu zaokrąglania.Podwójnie do dziesiętnego bez zaokrąglania po 15 cyfrach
przykład:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
wartość dziesiętną zwrócony przez Convert.ToDecimal (podwójne) zawiera maksymalnie 15 cyfr znaczących. Jeśli parametr wartości zawiera więcej niż 15 cyfr znaczących, jest zaokrąglany za pomocą zaokrągleń do najbliższego.
więc aby utrzymać moje precyzji, muszę konwertować mój podwójny do String, a następnie zadzwonić Convert.ToDecimal (String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
Ta metoda działa, ale chciałbym, aby unikać zmienną String w celu zamiany podwójnej na dziesiętną bez zaokrąglania po 15 cyfrach?
Czy znasz wcześniej zakres dla 'd'? Mogę zaoferować lekkie rozwiązania w pseudokodach (nie jestem dostatecznie zaznajomiony z C#, aby zapisać je w C#), jeśli wiesz, że 'd' jest w zakresie takim jak [-2..2] –
d zawsze będzie pomiędzy [- 1,1] –
Zakładam, że jest to "podwójne" pochodzące z innego miejsca, którego nie można zmienić? Jeśli zostanie zadeklarowany jako dziesiętny od początku ('decimal d = -0.99999999999999956m;') zachowuje tę dokładność. –