2015-10-25 8 views
-2

у меня есть что-то вроде этого в моем коде:Почему я получаю 0, когда я печатаю результат фракции в C?

a = -2; 
b = 1/a; 

printf("%d", b); 

Printf печатает 0. Кто-нибудь знает, почему это? И что мне делать, чтобы получить -0,5? Я также пробовал "%.2f", и это дало мне 0.00.

Благодаря

+1

Переменные 'a' и' b' объявлены как 'int' в вашем коде, не так ли? попробуйте объявить один из них как float, тогда вы получите '-0.5'. И до того, как вы напечатаете через '% .2f', значение уже' 0', u просто отбрасывается из '0', поэтому результат отливки также равен' 0'. –

+1

@EricWang: объявление одного из них как float wont work. Если b int int can not hold -0.5. Если a is int, вы снова попадаете в целочисленную арифметическую проблему. – tapananand

+0

@lesnar Да, я прав, я думаю, что есть другая переменная c, объявленная как float, и c = a/b, нужно, чтобы один из a или b был float. –

ответ

0

Поскольку типы данных для а и б не указаны я считая их типа междунар.

В C результат операции зависит от типов данных операндов. Результат не может иметь больше точности/точности/размера, чем сами операнды. То, с чем вы сталкиваетесь, связано с целыми арифметическими правилами.

Теперь, в вашем случае: оба -2 и 1 в b = 1/a являются целыми числами, поэтому результат будет усечен до целого числа, поэтому -1/2 = -0,5 усечено до 0. %.2f не поможет, поскольку значение в b уже 0.

Таким образом, чтобы b был -0.5. Вы должны иметь как a, так и b как float и print, используя% f.

или

Вы можете иметь, как INT и б, как поплавок и писать, как б 1.0/a. (Здесь 1 - float a is int, поэтому результатом будет float typecasting a to int).

или

через типажей: b = 1/(float)a;

Вы должны пройти через правила приведения типов.

2

Вы столкнулись с целочисленной арифметикой. В C и многих других языках такие деления, как 1/2, дают вам результат, которого вы не ожидаете, потому что и 1, и 2 являются целыми числами, а результат также является целым числом. Целые не может хранить 0.5, поэтому результат становится его дробная часть укороченная, и вы в конечном итоге с 0.

Для выполнения дробной арифметики, вам нужно использовать float с, double с, и т.д. Вы можете либо типа, которые непосредственно как 1.0/-2.0, или вы можете отличать ваши значения до других типов с помощью (double) a/b. Пока хотя бы один из операндов обрабатывает дробные части, ваш результат также будет содержать дроби.