当前位置: 首页 > 知识库问答 >
问题:

了解C#浮点数精度。C#如何存储浮点数?[复制]

太叔灿
2023-03-14

在处理浮点数时,我对C#中“精度”的实际含义有些怀疑。如果逻辑性不强,而且解释太长,我提前道歉。

我知道浮点数(例如10.01F)的精度为6到9位。假设我们有下一个代码:

float myFloat = 1.000001F;
Console.WriteLine(myFloat);

我在控制台里得到了确切的数字。现在,让我们使用下一个代码:

myFloat = 1.00000006F;
Console.WriteLine(myFloat);

打印了一个不同的数字:1.0000001,即使这个数字有9位数,这也是极限。

这是我的第一个怀疑。精度取决于数字本身还是计算机的结构?

此外,数据以位的形式存储在计算机中,在中间,我记得将数字的小数部分转换为位可能会导致在将数字转换回十进制时产生不同的数字。例如:

(Decimal) 1.0001 -> (Binary) 1.00000000000001101001
(Binary) 1.00000000000001101001 -> (Decimal) 1.00010013580322265625 (It's not the same)

我的逻辑是:也许浮点数在存储时不会丢失信息,也许当数字转换回十进制以显示给用户时,这些信息就会丢失。

例如。

float myFloat=9999999.11F 1.11F

上述结果应为:1000000.22。然而,由于这个数字超过了浮点的精度,我应该看到一个不同的数字,这确实发生了:1000000.25

差异为0.03。为了查看实际结果是否为1000000.22,我做了下一个条件:

if (myFloat == 1000000.22F) {
       Console.WriteLine("Real result = 100000.22");
}

它实际上打印了它:真实结果=100000.22

所以...信息丢失发生在将位转换回十进制时?或者它也发生在较低级别的计算中,我的例子只是巧合?


共有2个答案

苏彦君
2023-03-14

当您在代码中编写100000.22F时(编译器必须找到与要键入的十进制数最接近的结果的指数和尾数),以及转换为十进制以显示时,都会发生舍入。

在实际的算术运算中没有任何十进制/二进制类型的舍入,尽管算术运算确实存在与尾数位数有限相关的舍入误差。

虞滨海
2023-03-14
匿名用户

源代码中的1.000001F被转换为float值8388616•2−23,即1.00000095367431640625。

源代码中的1.0000000 6f转换为float值8388609•2−23,即1.00000011920928955078125。

控制台。WriteLine只显示其中一些值;默认情况下,它会将显示舍入到有限的位数。

999999.11F转换为15999986•2−4这是999999.125<代码>1.11F转换为9311355•2−23,即1.1100000143051474609375。当使用实数数学将其相加时,结果为8388609971323•2−23。这不能用浮点表示,因为浮点的分数部分(称为有效位)只能有24位,因此其作为整数的最大值为16777215。如果我们将该有效位除以219,将其减少到该极限,我们得到大约8388609971323/219•2−23•219=16000003.76•2−4。将有效位四舍五入为整数将产生1600004•2−4。因此,当这两个数字相加时,float算术对结果进行四舍五入,并生成1600004•2−4,即1000000.25。

所以...信息丢失发生在将位转换回十进制时?或者它也发生在较低级别的计算中,我的例子只是巧合?

将十进制数字转换为浮点通常会导致舍入错误。

添加浮点数通常会导致舍入错误。

将浮点数转换为精度有限的十进制数字通常会导致舍入误差。

 类似资料:
  • 问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量

  • 本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下 示例 类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。 FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为 x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十

  • 为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度

  • 我想在C中设置浮点的精度。假设我的代码是 < code>float a = 23.5,b = 24.36浮动c = a b; 如果我发表了这个 它给出:46.86 但我想打印到小数点后一位。怎么做?

  • 本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记

  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?