1) Во время преобразования числа с плавающей точкой в целое, дробная часть отбрасывается; никакого округления не производится. Статический класс System.Convert предоставляет методы, которые выполняют преобразования между различными числовыми типами с округлением.
2) Неявное преобразование большого целочисленного типа в тип с плавающей точкой сохраняет величину, но иногда может приводить к потере точности. Причина в том, что типы с плавающей точкой всегда имеют большую величину, чем целочисленные типы, но могут иметь меньшую точность. Для демонстрации сказанного рассмотрим пример с большим числом:
int i1 = 100000001;
float f = i1; // Величина сохраняется, точность теряется
int i2 = (int)f; // 100000000
3) Ошибки округления вещественных чисел
Типы float и double внутренне представляют числа в двоичной форме. По этой причине точно представляются только числа, которые могут быть выражены в двоичной системе счисления. На практике это означает, что большинство литералов с дробной частью (которые являются десятичными) не будут представлены точно.
Например:
float tenth = 0.1f; // Heточно 0.1
float one = 1f;
Console.WriteLine (one - tenth * 10f); // -1.490116E-08
Именно поэтому типы float и double не подходят для финансовых вычислений. В противоположность им тип decimal работает в десятичной системе счисления и, таким образом, может точно представлять числа, выразимые в десятичной системе (а также в системах счисления с основаниями-множителями 10 — двоичной и пятеричной). Поскольку вещественные литералы являются десятичными, тип decimal может точно представлять такие числа, как 0.1. Тем не менее, ни double, ни decimal не могут точно представить дробную часть, десятичное представление которой является периодическим:
decimal m = 1M / 6M; // 0.1666666666666666666666666667M
double d = 1.0 / 6.0; // 0.16666666666666666
Это приводит к накапливающимся ошибкам округления:
decimal notQuiteWholeM = m+m+m+m+m+m; // 1.0000000000000000000000000002M
double notQuiteWholeD = d+d+d+d+d+d; // 0.99999999999999989
которые нарушают работу операций эквивалентности и сравнения:
Console.WriteLine (notQuiteWholeM == 1M); // Выводит False
Console.WriteLine (notQuiteWholeD < 1.0);/ / Выводит True
Андерс Хейлсберг. Язык программирования C#, 4-е издание