Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-数字变量类型-以2为基数/以10为基数的符号_C# - Fatal编程技术网

C#-数字变量类型-以2为基数/以10为基数的符号

C#-数字变量类型-以2为基数/以10为基数的符号,c#,C#,有一件小事让我在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.79999999701976

有一件小事让我在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
十进制-结果与我预期的一样,因为我知道它们以10为基数

Float-我很惊讶,知道它是以基数2表示的,它实际上显示了结果 就好像它是以10为基数的记数法,但精度不高

双c-与浮点数相同

双x-显示我期望浮动发生的结果

问题是浮动组双“c”组和双“x”组发生了什么?为什么双“x”组失去了其精度,而浮点数组实际上是以10为基数进行计算的,从而给出了所谓的“预期”计算结果?想知道为什么将双x组的数字类型声明为F会如此剧烈地改变它的结果吗

对于它的价值,我只希望十进制组给我'-0.8'结果,所有其他的都给'-0.799999997019768'一些东西


看起来我缺少了一些理解的环节,这些理解发生在计算是如何处理的

首先-这与基数2和基数10无关。您的所有值都使用基数10表示。本规范中未使用任何Base 2

看起来我缺少了一些理解的环节,这些理解发生在计算是如何处理的

float
double
都对数字使用浮点表示,这不是100%准确。显示该值时,将进行舍入。由于
float
本身精度较低,因此它四舍五入到较少的小数点,这可以使它在某些情况下“看起来”更精确(即使它实际上精度较低)

在您的例子中,“x”组和“c”组显示不同的原因是您声明x1和x2变量如下:

double x1 = 0.2F;
double x2 = 1.0F;
实际上,这与执行以下操作相同:

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
因此,
x1
x2
c1
c2
的值并不完全相同。这会造成更大的精度损失,稍后进行减法运算时,精度损失足以使打印不再圆化


如果你想真正理解这一点,最好读一篇文章。大多数常见的编程语言都使用类似的浮点数表示法,因此这些问题相当普遍。

首先,这与基数2和基数10无关。您的所有值都使用基数10表示。本规范中未使用任何Base 2

看起来我缺少了一些理解的环节,这些理解发生在计算是如何处理的

float
double
都对数字使用浮点表示,这不是100%准确。显示该值时,将进行舍入。由于
float
本身精度较低,因此它四舍五入到较少的小数点,这可以使它在某些情况下“看起来”更精确(即使它实际上精度较低)

在您的例子中,“x”组和“c”组显示不同的原因是您声明x1和x2变量如下:

double x1 = 0.2F;
double x2 = 1.0F;
实际上,这与执行以下操作相同:

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
因此,
x1
x2
c1
c2
的值并不完全相同。这会造成更大的精度损失,稍后进行减法运算时,精度损失足以使打印不再圆化


如果你想真正理解这一点,最好读一篇文章。大多数常见的编程语言都使用类似的浮点数表示法,因此这些问题是相当普遍的。

在C语言中,程序员长期以来一直感到困惑。编译器经常这样做是为了加快速度,因为很多处理器都是这样做的。我不太清楚具体细节(如果我错了,有人可以随时纠正我),但
b
部分的计算似乎使用了这种额外的精度

x
组中,
double
变量已经具有额外的精度,但是在它们中加入
float
类型的常量很可能会导致编译器的行为微妙地不同,从而导致精度较低的结果。由于双精度已经稍微偏离了它们应该达到的位置,因此完全的
double
精度只是将误差向前传递

归根结底,C#中的浮点精度在很大程度上是不可明确依赖的,因为编译器有很大的回旋余地,可以根据自己的选择进行微调,但它认为优化效果最好,只要它提供规范中规定的最小精度


哦,这些都与base 2无关。

在C#that中,程序员长期以来一直感到困惑。编译器经常这样做是为了加快速度,因为很多处理器都是这样做的。我不太清楚具体细节(如果我错了,有人可以随时纠正我),但
b
部分的计算似乎使用了这种额外的精度

x
组中,
double
变量已经具有额外的精度,但是在它们中加入
float
类型的常量很可能会导致编译器的行为微妙地不同,从而导致精度较低的结果。由于双精度已经稍微偏离了它们应该达到的位置,因此完全的
double
精度只是将误差向前传递

归根结底,C#中的浮点精度在很大程度上不是可以明确依赖的,因为编译器有一个l