2014-01-31 4 views
1

Пытаясь создать набор Мандельброта, я пытался использовать 8 и 15 цифр переменных с плавающей запятой в моей программе и столкнулся с проблемой: double приближается к 0. Я попробовал модульное тестирование и написал этот код, чтобы изолировать проблему. Используя переменную viewer, значения h и w оба были на 0.0, в отличие от 0.00185185185185 и 0.0015625, но когда я просто пишу double h = 0.0015625, он работает.Точка с плавающей точкой C#

Большое спасибо за помощь.

int apparentwidth = 3; 
int apparentheight = 2; 
int height = 1080; 
int width = 1920; 

double w = (apparentwidth/width); 
double h = (apparentheight/height); 

Console.WriteLine(w); 
Console.WriteLine(h); 
+1

математика выполняется на целых, а затем вы преобразования с плавающей точкой. Вы, вероятно, хотите преобразовать, прежде чем делать математику. – kenny

ответ

3

Вы разделив две int переменные, и результатом является int. Вы сохраняете результат в double, но масштаб (часть после десятичной) уже потерян.

Использование double в течение:

double apparentwidth = 3; 
double apparentheight = 2; 
double height = 1080; 
double width = 1920; 

double w = (apparentwidth/width); 
double h = (apparentheight/height); 

Или отбрасываемой одной из переменных в виде double при делении:

double w = ((double)apparentwidth/width); 
double h = ((double)apparentheight/height); 
+0

Я не согласен с использованием двойного на всем протяжении. Кажется, что нет необходимости использовать здесь 64-битное число, кроме сохранения точности деления при кастинге. Черт, в зависимости от того, что в OP короткое, вероятно, будет достаточно. – Timeout

+0

@Jay Это скорее комментарий к коду OP. Я не уверен, какой тип данных будет правильным для того, что он в конечном итоге пытается сделать. Он хотел знать, почему он теряет часть своей ценности; один ответ - использовать один и тот же плавающий тип. –

1

Вы делаете целочисленное деление на аварии.

double w = (double)apparentwidth/(double)width; 
double h = (double)apparentheight/(double)height; 
1

Просто, чтобы обеспечить дальнейшее объяснение других ответов:

При выполнении математических операций над int с, результатом является int, и это достигается за счет эффективного усечения нецелым части:

3/2 == 1 

Когда выполняется операция, включающая по крайней мере один double, то int вход сначала преобразуется в double, так что результат является double:

1.0/4 == 0.25 
4 * 0.25 == 1 

И конечно, если оба входа double результат double и не неявное преобразование не происходит:

1.0/4.0 == 0.25 
Смежные вопросы