2014-01-24 4 views
-2

я нашел результат двойной/двойной не является правильным:Почему `double i = 3.3, j = 1.1; int k = i/j; printf ("% d n", k); `получает 2?

double i = 3.3, j = 1.1; 
int k = i/j; 
printf("%d\n", k); 

результат 2, почему ??
Debugging:

enter image description here

Но:

float i = 3.3, j = 1.1; 
int k = (int)(i/j); 
printf("%d\n", k); 

Debugging:

enter image description here

+1

Конечно, результат равен 2. Реальные вопросы вот почему вы думаете, что это будет что-то еще, и конкретно, как вы думаете, какой результат должен быть? –

+2

Здесь мы снова и снова ... –

+0

@HighPerformanceMark Я думаю, что вы можете сами ответить на эти реальные вопросы :). – Kos

ответ

2

3,2999/1,10 дает 2,99 и некоторые вещь, которая на преобразования в целое дает выходу 2

0
double i = 3.3, j = 1.1; 
int k = i/j; 

из пути десятичных чисел представлены в памяти, результат I/J, на самом деле 2,999999 ... компилятор преобразует resutl i/j с двойного int, потому что k является int. И вот как вы закончили с результатом 2

+1

Я думаю, он знает, что компилятор преобразует его в 'int'. Вопрос в том, почему итоговое целое число равно 2, а не 3, потому что 3.3/1.1 = 3. –

2

Двойной не может представлять 3.3, даже если вы напишете 3.3 в своем коде, двойник сохранит его как 3.2999999999999998. (Это не может хранить 1,1 точную либо, это будет 1.1000000000000001)

Так i/j выполняет 3,2999999999999998/+1,1000000000000001, результат которого будет храниться в виде 2.9999999999999996

преобразования двойной к междунар усекает значение, оно не вокруг него до ближайшего целого числа, поэтому 2.9999999999999996 будет преобразован в 2

This применим также к C с плавающими точками IEEE 754 и имеет много дополнительных ресурсов.

0

Как вы знаете, что 3.3 не может быть представлено в двоичном формате правильно и то же самое для 1.1, оценки k = i/j результатов в

3.2999999999999998/1.1000000000000001 < 3 

Назначение это int типа k укоротить его 2.

Смежные вопросы