Значение переменной изменяется. - PullRequest
0 голосов
/ 22 октября 2011

Я начинаю изучать программирование на C, и у меня возникла проблема с этим кодом:

#include <stdio.h>

float jobPrice (int numberOfPages, float pricePerSheet, float pricePerPlate, int numberOfCopies)
{
    return (((pricePerPlate * numberOfPages) + ((numberOfPages/2)*numberOfCopies*pricePerSheet) + (numberOfCopies*2)) * 1.175f);
}


float colourPrinting (int numberOfPages, int numberOfCopies)
{
    return jobPrice(numberOfPages, 0.04f, 28.00f, numberOfCopies);
}

int main ()
{
    printf("%f\n", colourPrinting(32, 1000));
    return 0;
}

Значение, которое должно быть напечатано, равно 4154.8, но моя программа печатает 4154.799805. Я отладил код, и кажется, что при вызове jobPrice с параметром pricePerSheet, равным 0.04f, он меняется на 0.0399999991.

Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 22 октября 2011

Используйте double вместо float.A float содержит не более 7 значащих десятичных цифр, а ваш формат печати пытается извлечь 10, что приводит к появлению мусора.Или выведите только 2 десятичных знака;это даст вам ответ с 6 значащими цифрами.

См. 'Что должен знать каждый специалист по вычислительной технике об арифметике с плавающей запятой' для получения дополнительной информации.

2 голосов
/ 22 октября 2011

Числа с плавающей точкой представлены не точно, а скорее в приближении.

0.0399999991 - это представление вашей системы 0.04f

Подробнее об этом можно прочитать здесь .

1 голос
/ 22 октября 2011

Арифметика с плавающей точкой не является точной;нет никакой гарантии, что если вы начнете с одного знака после запятой, вы сохраните один знак после запятой, даже если вы выполняете только те операции, которые, если бы вы делали на бумаге, давали такое же количество знаков после запятой.Если вы хотите сохранить определенное количество десятичных знаков (особенно при работе с деньгами), используйте целые числа и при необходимости конвертируйте их в десятичные числа (если вы работаете с долларами, вы можете думать об этом как о центах).

...