странно про точность вывода функции "printf" - PullRequest
0 голосов
/ 10 марта 2012
    printf("%.2lf\n",odd);                        //(1)
    printf("%.2lf\n",37.975);                     //(2)
    printf("%.2lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.3lf\n",(odd*0.65 -1)*2);            //(4)

Ниже приведен вывод:

30,75

37,98

37,97

37,975

Почему вывод выражения(3) не 37,98?

Я использую G ++.

Ответы [ 3 ]

3 голосов
/ 10 марта 2012

Вероятно, это связано с ошибками округления с плавающей запятой.Результат (odd * 0.65 - 1) * 2 скорее всего 37.97499999999999 или что-то близкое (но меньше) 37.975.По обычным правилам округления это значение округляется до 37.97 на выходе.

2 голосов
/ 10 марта 2012

Поскольку я получаю другой результат с odd, установленным на 37,975, причина, скорее всего, в том, что odd немного меньше , чем 30,75 в ваших вычислениях (вы не показываете его округленным в вашем вопросе), что делает результат расчета в число немного меньше, чем 37,975.

1 голос
/ 10 марта 2012

Компьютер (двоичная) с плавающей запятой не может точно представлять десятичные числа, точно так же, как десятичная с плавающей запятой не может представлять некоторые дроби.Например, 1/9 = .11111111111 .... Покажите больше цифр точности, и вы увидите, что произошло.

Поскольку вы не указали значение odd, я выбрал тот, который далтот же результат:

#include <stdio.h>

int main()
{
    double odd = 30.7499;
    printf("%.2lf\n",odd);                        //(1)
    printf("%.2lf\n",37.975);                     //(2)
    printf("%.2lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.3lf\n",(odd*0.65 -1)*2);            //(4)
    printf("%.20lf\n",odd);                        //(1)
    printf("%.20lf\n",37.975);                     //(2)
    printf("%.20lf\n",(odd*0.65 -1)*2);            //(3)
    printf("%.20lf\n",(odd*0.65 -1)*2);            //(4)
    return 0;
}

Вывод

30.75
37.98
37.97
37.975
30.74990000000000000000
37.97500000000000100000
37.97487000000000300000
37.97487000000000300000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...