C#浮点精度

时间:2014-01-31 01:38:23

标签: c# floating-point

尝试创建Mandelbrot集,我一直在尝试在程序中使用8位和15位浮点变量,并遇到了一个问题:double近似于0。我尝试了单元测试并编写了这段代码来隔离问题。使用变量查看器,hw值都在0.0上,而不是0.001851851851850.0015625,但是当我写{{1}时它有效。

非常感谢您的帮助。

double h = 0.0015625

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

你是在意外进行整数分割。

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

答案 2 :(得分: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