Safe Range of double, который может быть брошен, чтобы плавать без потери данных
Каков безопасный диапазон double, который может быть приведен к плавающей точке без потери данных (как с дробной частью, так и без нее)
Пример:
double value = 1423210126.00f;
float floatVal = (double)value;
//floatVal = 1423210112 if we print. There is a data loss of +14.
Мое наблюдение: Если число двойных цифр равно 7 цифрам (или 8 включительно "."), Значение успешно разыгрывается как плавающее без потерь. Это правда всегда?
2 ответа
Сначала вы не должны добавлять f к:
double value = 1423210126.00f;
потому что f используется для float, и вы на самом деле говорите, что ваш номер float, а вот double.try мой пример:
private void Form1_Load(object sender, EventArgs e)
{
double y = 123456.123456789123456789;
float x = 123456.123456789123456789f;
MessageBox.Show(x.ToString());
MessageBox.Show(y.ToString());
}
Вы можете видеть, что напечатанные номера:
123456,1
+123456,123456789
так что float может содержать до 6 цифр и удваивать до 14 цифр, и в этом примере, если вы конвертируете double в float, он будет содержать до 6 цифр (с цифрами после "."), и пока ваш номер находится в диапазоне с плавающей точкой, он будет точным в противном случае вы потеряете данные (более 6 цифр). также посмотрите минимальное и максимальное значение:
и см. ниже сообщение для получения дополнительной информации.
7-я цифра с плавающей точкой и 15-я цифра с двойной точностью могут быть точными или нет, зависит от того, находится ли число в диапазоне или нет.
Число с плавающей запятой 32-битное, а с двойным 64. Что означает, что число с плавающей запятой может хранить только половину от того, что может хранить двойная. Так что в основном float может хранить вдвое меньше данных, чем тот, который может хранить double.