有一件小事让我在c#中拼图:)
这是我的变量和结果:
decimal a1 = 0.2M;
decimal a2 = 1.0M;
a1 - a2 = -0.8
float b1 = 0.2F;
float b2 = 1.0F;
b1 - b2 = -0.8
double c1 = 0.2;
double c2 = 1.0;
c1 - c2 = -0.8
double x1 = 0.2F;
double x2 = 1.0F;
x1 - x2 = -0.799999997019768
Run Code Online (Sandbox Code Playgroud)
十进制 - 结果与我预期的一样,因为它知道它们以基数10表示法工作.
浮动 - 让我感到惊讶,知道它在基础2表示法上工作,它实际上显示结果好像它作为基础10表示法而没有失去精确度.
Double c - 与Float相同.
Double x - 显示我希望Float发生的结果.
问题是Float,Double'c'和'x'群体正在发生什么?为什么Double'x'组失去了它的精度,而Float组实际上以10的基数表示,这样可以说出"预期"的计算结果?想知道为什么将Double x组的数字类型声明为F如此彻底地改变它的出来?
为了它的价值,我只希望Decimal组给我'-0.8'的结果,所有其他的东西给'-0.799999997019768'.
看起来我错过了一些关于计算如何处理的理解的链接.
首先 - 这与base 2与base 10无关.所有值都使用base 10表示.在此代码中不使用Base 2.
看起来我错过了一些关于计算如何处理的理解的链接.
两者float并double用对数字的浮点表示,这是不是100%精确.当显示的值,所以四舍五入发生.由于float具有固有的较低精度,它会四舍五入到较少的小数点,这可以使它在某些情况下"显得"更准确(即使它实际上不太精确).
在您的情况下,"x"组和"c"组显示不同的原因是您声明x1和x2变量如下:
double x1 = 0.2F;
double x2 = 1.0F;
Run Code Online (Sandbox Code Playgroud)
这实际上与以下相同:
float temp = 0.2f;
double x1 = temp; // Convert from float to double, which has a loss of precision
temp = 1f;
double x2 = temp; // Convert from float to double, which has a loss of precision
Run Code Online (Sandbox Code Playgroud)
因此,x1并x2没有完全一样的值c1和c2.这导致更多的精度损失,后来,当减法发生时,足以使打印不再圆.
如果你想真正理解这一点,一篇好文章就是每个计算机科学家应该知道的关于浮点运算的内容.最常见的编程语言对浮点数使用类似的表示,因此问题相当普遍.
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |