В сильно типизированных языках результат математических операций обычно такой же, как у более крупного типа.
У C# есть список implicit numeric conversions он будет делать.
Обобщение этого списка: интегральные типы могут быть преобразованы в типы с плавающей точкой, но не наоборот. Интегральные типы также могут быть неявно преобразованы в decimal
, но типы с плавающей точкой не могут.
Примечание: Это также означает, что приведение одного из значений к другому типу приведет к тому, что весь ответ будет таким. например: (decimal) a/b * 100.0 = 50.0
TL; др:
В C#:
int/int = int
int + decimal = decimal
decimal + int = decimal
int/int * decimal = (int/int = int) * decimal = decimal
int - float = float
int * double = double
float/decimal = an error
int - uint = an error (either that or ulong)
с = (а * 100)/б; – kenny
Это не сработает. a * 100/b по-прежнему усекает десятичную и затем преобразует в десятичный тип. У вас не будет мантиссы. – Armstrongest
c = (a * 100M)/b; Кроме того, см. Http://mathworld.wolfram.com/IntegerDivision.html – Greg