2012-06-17 6 views
12

Czy (int)myDouble różni się od (int)Math.Truncate(myDouble)?Czy (int) myDouble kiedykolwiek różni się od (int) Math.Truncate (myDouble)?

Czy jest jakiś powód, dla którego powinienem preferować jeden nad drugim?

+0

Moje naiwne przypuszczenie byłoby takie, że ta ostatnia jest jednoznacznie zdefiniowanym aspektem API CLR, podczas gdy pierwsza jest zależna od specyfikacji języka, mimo że jest niejawnie taka sama. –

+0

Myślę, że użycie 'Math.Truncate' jest niepotrzebnym krokiem. – Oded

+3

'Math.Truncate' jest przeznaczony do sytuacji, gdy zachodzi potrzeba zachowania wyniku jako' double' bez części ułamkowej. Jeśli chcesz go przyłączyć do 'int', użyj obsady. – Douglas

Odpowiedz

8

Math.Truncate jest przeznaczony do sytuacji, gdy zachodzi potrzeba zachowania wyniku jako podwójnego bez części ułamkowej. Jeśli chcesz zakodować go w int, po prostu użyj rzutowania bezpośrednio.

Edit: Dla porównania, tutaj jest odpowiednia dokumentacja od „Explicit Numeric Conversions Table”:

Podczas konwersji z wartości podwójnego lub pływaka do integralnego typu, wartość jest obcięty.

5

Jak podkreślił Ignacio Vazquez-Abrams(int)myDouble zawiedzie w taki sam sposób jak (int)Math.Truncate(myDouble) gdy myDouble jest zbyt duża.

Tak więc nie ma różnicy w wydajności, ale (int)myDouble działa szybciej.

+2

+1: Ta odpowiedź podnosi odpowiedni punkt. Poza tym, musisz usunąć rzutowanie '(int)' z obciętego podwójnego, ponieważ w przeciwnym razie znalazłbyś się w tej samej sytuacji. – Douglas

+0

@Ignacio Vazquez-Abrams, masz rację. – dantuch

+0

Nie można użyć '(long)', jeśli oczekiwaliśmy, że liczba będzie dość duża? – mpen

Powiązane problemy