Почему printf ("%. 2f", (double) 12.555) возвращает 12.55? - PullRequest
0 голосов
/ 28 января 2019

Я писал программу, в которой мне нужно было округлить двойное до второго десятичного знака.Я заметил printf ("%. 2f", (double) 12.555), возвращают 12.55 .Однако printf ("%. 2f", (float) 12.555) возвращает 12,56 .Кто-нибудь может объяснить, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Плавающие и двойные значения хранятся внутри, используя IEEE 754 представление.Часть, которая имеет отношение к вашему вопросу, состоит в том, что как числа с плавающей запятой, так и числа с двойными числами хранят самое близкое к десятичному числу, которое они могут, учитывая пределы их представления.Грубо говоря, эти ограничения связаны с преобразованием десятичной части исходного числа в двоичное число с конечным числом бит.ближайший двойной к 12.555 - 12.554999999999999715782905696.Обратите внимание, что удвоение обеспечивает большую точность, но ошибка отрицательна.

В этот момент, вероятно, теперь очевидно, почему функция округления увеличивается для float, но понижается для double - они оба округляются до ближайшего десятичное число в базовом представлении.

0 голосов
/ 28 января 2019

12.555 - это число, которое не может быть точно представлено в двоичной форме с плавающей запятой.Бывает, что самое близкое значение к 1,2555, которое может быть представлено в вашей системе с плавающей запятой двойной точности, немного меньше, чем 1,2555, а самое близкое значение к 1,2555, которое можно представить в виде плавающей запятой одинарной точности, немного больше, чем 1,2555.

Если предположить, что режим округления, используемый преобразованием, является округлением до ближайшего (привязано к четному), что является значением по умолчанию в стандарте IEEE 754, то следует ожидать описанного вывода.

...