При вызове ToString()
на неточных числах с плавающей запятой получаются числа, которые может ожидать человек (например, 4.999999 ... печатается как 5
). Однако при приведении к int дробная часть отбрасывается, и в результате получается целое число, уменьшенное на 1.
float num = 5f;
num *= 0.01f;
num *= 100f;
num.ToString().Dump(); // produces "5", as expected
((int)num).ToString().Dump(); // produces "4"
Как мне привести число с плавающей точкой к int, чтобы я получил дружественную человеку ценность, которую производит float.ToString()
?
Я использую этот грязный хак:
int ToInt(float value) {
return (int)(value + Math.Sign(value) * 0.00001);
}
.. но, безусловно, должно быть более элегантное решение.
Редактировать: Мне хорошо известны причины, по которым числа с плавающей точкой обрезаются в том виде, в каком они есть (4.999 ... до 4 и т. Д.). Вопрос заключается в приведении к int
при эмуляции поведения по умолчанию System.Single.ToString ()
Чтобы лучше проиллюстрировать поведение, которое я ищу:
-4.99f должно быть приведено к -4
4.01f должно быть приведено к 4
4.99f должно быть приведено к 4
4.999999f должно быть приведено к 4
4.9999993f должен быть приведен к 5
Это то же поведение, что и ToString
.
Попробуйте запустить это:
float almost5 = 4.9999993f;
Console.WriteLine(almost5); // "5"
Console.WriteLine((int)almost5); // "4"