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.

Другие вопросы по тегам