Twój błędem jest to, że myślisz, że wynik jest 0.123
natomiast jest 0
zamiast.
C# (i wiele innych języków takich jak C) określenia, że operacje związane z dwóch integralnych liczby powrotu zawsze liczbą całkowitą, tak 1 + 1
powróci 2
, nie 2.0
i 3/2
powróci 1
nie 1.5
. Część ułamkowa w tym przypadku jest po prostu odrzucana, więc zawsze zaokrągla się do zera (to znaczy, że dla pozytywnych wyników ją zaokrągla, dla ujemnych ją zaokrągla).
Chociaż jest to trochę sprzeczne z intuicją, główną przyczyną jest prostota języka/kompilatora, szybkość wykonywania (ponieważ nie trzeba wymyślać, jaki typ ma wynik), możliwość korzystania z operatorów takich jak /=
, które nie zadziałałby, gdyby wynik był innego typu) i historycznej spuścizny i bezwładności.
Do tego trzeba wykonać co najmniej jeden z twoich argumentów liczbę zmiennoprzecinkową rozwiązać (drugi będzie naśladownictwa automatycznie, podobnie jak wynik):
// either
if (123.0/1000 > 0)
// or
if (123/1000.0 > 0)
// or
if (123.0/1000.0 > 0)
Jeśli masz zmienne zamiast tego może potrzebować typecast (jak nie można po prostu dołączyć .0
:-)):
if ((double)a/b > 0)
i zwykle rada odnosi się również tutaj: Przy programowaniu rzadko zaufać swojej intuicji, ponieważ komputery są dziwne maszyny i języki programowania czasami nawet ul leśniczy. Drukowanie wyniku gdzieś lub przypisanie go do zmiennej i sprawdzanie w debugerze pokazałoby, że twoje oczekiwania były wyłączone :-)
int/int jest zawsze int ... Hej jest to dobry pomysł na piosenkę ... – ppeterka
co jeśli ((123.0/1000.0)> 0.0) dajesz? – Dutts
alteast jeden z operandów powinien być liczbą zmiennoprzecinkową, można podać 'if ((123d/1000)> 0)' – Habib