Преобразование float в int в F # - PullRequest
7 голосов
/ 04 января 2009

Может кто-нибудь объяснить, почему int (0.4 * 10.0) это 4 пока int ((2.4 - 2.0) * 10.0) это 3?

А потом также, пожалуйста, объясните, как получить 4. т.е. действительно ли я должен сделать int (System.Math.Round((2.4 - 2.0) * 10.0))?

Это просто ужасно для чего-то, что должно быть таким простым.

Ответы [ 5 ]

11 голосов
/ 04 января 2009

Двойное представление 2,4 - 2,0 составляет 0,399999999999. Когда вы конвертируете число в int, десятичная часть усекается, поэтому 3.999999999 усекается до 3.

5 голосов
/ 05 января 2009

На самом деле, в .Net существует тип данных decimal, который поможет вам решить эту проблему, если ваши числа могут быть представлены именно в десятичных долях.

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4
5 голосов
/ 05 января 2009

И затем также, пожалуйста, объясните, как получить 4. То есть действительно ли я должен сделать

int (System.Math.Round ((2,4 - 2,0) * 10,0))

это просто ужасно для чего-то, что должно быть таким простым.

Конечно, нет, просто определите

let round x = int System.Math.Round(x)
3 голосов
/ 19 октября 2015

Для преобразования номера float в int используйте:

let i = Convert.ToInt32(f)

1 голос
/ 04 января 2009

Числа с плавающей точкой не имеют бесконечной точности. Некоторые числа могут быть представлены идеально (все, что включает в себя степени двух, например, 1, 1/2 = 0,5, 1/4 = 0,25 и т. Д.), А другие не могут (например, 1/3 не может быть точно разложена в конечную последовательность полномочий двух). Часто прерывание конца бесконечного ряда приводит к тому, что закодированная версия числа немного меньше его истинного значения.

Объедините это с тем фактом, что оператор (int) обрезает, а не округляет, и вы можете столкнуться с ситуацией, когда операция, которая должна дать 4,0, приводит к 3,999999999991 вместо этого, что становится 3 *

Каждый раз, когда вы пытаетесь преобразовать числа с плавающей запятой / двойные в целые, вам нужно тщательно продумать, какой оператор вы хотите использовать - усечение (округление вниз), округление вверх или округление до ближайшего.

Поскольку это проблема с представлениями с плавающей точкой, это верно не только для F #, но и для C # и (IIRC) Java и других языков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...