2014-01-31 120 views
1

试图创建一个Mandelbrot集,我一直试图在我的程序中使用8位和15位浮点变量,并且遇到了问题:double接近0。我试过单元测试,并编写了这段代码来隔离这个问题。使用可变查看器,hw值都在0.0,而不是0.001851851851850.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

你除以2个int变量,其结果是int。您将结果存储在double中,但标度(小数点后的部分)已经丢失。

使用double遍及:变量的double

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

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

或铸一个分割时:

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

我不同意在整个过程中使用double。似乎没有必要在这里使用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