Числа с плавающей точкой не имеют бесконечной точности. Некоторые числа могут быть представлены идеально (все, что включает в себя степени двух, например, 1, 1/2 = 0,5, 1/4 = 0,25 и т. Д.), А другие не могут (например, 1/3 не может быть точно разложена в конечную последовательность полномочий двух). Часто прерывание конца бесконечного ряда приводит к тому, что закодированная версия числа немного меньше его истинного значения.
Объедините это с тем фактом, что оператор (int) обрезает, а не округляет, и вы можете столкнуться с ситуацией, когда операция, которая должна дать 4,0, приводит к 3,999999999991 вместо этого, что становится 3 *
Каждый раз, когда вы пытаетесь преобразовать числа с плавающей запятой / двойные в целые, вам нужно тщательно продумать, какой оператор вы хотите использовать - усечение (округление вниз), округление вверх или округление до ближайшего.
Поскольку это проблема с представлениями с плавающей точкой, это верно не только для F #, но и для C # и (IIRC) Java и других языков.