Неправильный двойной расчет в C? - PullRequest
3 голосов
/ 20 октября 2011

Я использую DevC ++ 4.9, работаю на WinXP SP3 (32 бита), вот код:

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
    double value;

    int i;

    printf("Enter double: ");
    scanf("%lf", &value);
    i = value*100;
    printf("double: %lf\n", value);
    printf("int: %d\n", i);

  system("PAUSE");  
}

Я ввел разные значения и вот результаты:

Тест 1:

enter image description here

Тест 2:

enter image description here

Тест 3:

enter image description here

Почему тест 1 и тест 2 показали разные результаты ??

1 Ответ

6 голосов
/ 20 октября 2011

Это происходит из-за округления с плавающей запятой:

Что должен знать каждый компьютерщик об арифметике с плавающей запятой: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

3.07 не может быть точно представлено в двоичной,В вашем случае он округляется до значения, немного меньшего 3.07, поэтому 100 * 3.07 оценивается как 306.9999999..., который усекается до 306.

То же относится и к 3.05.Но 3.06, немного округлено.Так что 100 * 3.06 правильно отображается как 306.

...