печать значения с плавающей запятой для точности консоли. - PullRequest
1 голос
/ 11 ноября 2011

Я только что заметил что-то странное в моем коде

Я создал простое приложение, чтобы показать вам, о чем я говорю

float Test1 = 112.12;
float Test2 = 0.12;

printf("Test1 %15f", Test1);
printf("Test1 %15f", Test1);

Я всегда думал, что если я напишу Test1 = 112.12, это означает, что он равен 112.120000000

однако я получаю 112.120003

и во втором примере я получаю 0.11999 или 0.120000, это зависит

Может ли кто-нибудь объяснить мне, почему это происходит и что произойдет, если я попытаюсь разделить эти два числа, будут ли они преобразованы в двойные (или любой другой, более точный тип данных), чтобы я мог получить более высокую точность, или они будут использованы в их текущая форма (float)

Я использовал VS 2010 для проверки этого (если это имеет значение)

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Два наблюдения:

  1. компьютеры используют базу 2, а не базу 10
  2. числа с плавающей точкой не точны

Из-за первого пункта, есть некоторые цифры, которые плохо переводятся из нашей системы в систему компьютера. 0.3 не может быть на 100% точно представлен напрямую в двоичном формате (это не значит, что компьютеры не могут точно представить его, просто что они не могут это сделать с обычно используемой системой).

Из-за второй точки всегда опасно использовать числа с плавающей запятой для точных значений. Я бы порекомендовал прочитать статью в Википедии о числах с плавающей точкой - там упоминаются проблемы с точностью.

0 голосов
/ 11 ноября 2011

Это связано с тем, как компьютеры хранят номера. Посмотрите эти две статьи в Википедии

Не используйте float, кроме случаев, когда это действительно необходимо. Вместо этого используйте double.

...