Za każdym razem, gdy potrzebujemy dużej dokładności dziesiętnej, do obliczeń używamy miejsc dziesiętnych. Czy istnieje sposób sprawdzenia, czy precyzja wystarczyła do obliczeń?Jak uzyskać wyjątek dotyczący niedokładnych obliczeń?
Chciałbym zrobić poniższy kod wyjątek:
decimal almostMax = Decimal.MaxValue - 1;
decimal x = almostMax + 0.1m; // This should create an exception, since x equals almostMax.
Assert.AreEqual(x, almostMax); // This does NOT fail.
To naprawdę nie ma znaczenia w prawdziwym kodzie, ale byłoby miło, aby być bezpieczne.
Ułamki dziesiętne mają dokładność 28 cyfr (niektóre, ale nie wszystkie, wartości mogą zawierać 29 cyfr). Jako Decimal.MaxValue jest numerem 28digit, dodając 0.1m przekracza precyzję dziesiętnej, dlatego te dwie wartości są równe i Assert nie zawiedzie. – PaulF
@PaulF, myślę, że OP jest tego świadomy. Szuka sposobu na wykrycie tego problemu podczas uruchamiania. –
Należy pamiętać, że wyjątek jest operacją wagi ciężkiej i powinien być używany tylko do rzeczy, które nie powinny się zdarzyć. Jeśli jest prawdopodobne, że niektóre obliczenia zawiodą, powinieneś zamiast tego użyć wzorca takiego jak "TryParse", który zwraca wartość boolean zamiast rzucania i będzie znacznie szybszy. – Lukos