【发布时间】:2021-09-02 15:48:01
【问题描述】:
在处理浮点数时,我对 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 = 999999.11F + 1.11F;
上面的结果应该是:1000000.22。然而,由于这个数字超过了浮点数的精度,我应该看到一个不同的数字,这确实发生了:1000000.25
有 0.03 的差异。为了查看实际结果是否为1000000.22,我做了下一个条件:
if (myFloat == 1000000.22F) {
Console.WriteLine("Real result = 100000.22");
}
它实际上打印了它:Real result = 100000.22。
那么......当将位转换回十进制时会发生信息丢失?或者它也发生在较低级别的计算中,我的例子只是巧合?
【问题讨论】:
-
It is non-sensical and wrong to say the C#
floattype has a precision of 6-9 digits. 忘记你听说过或看到过。 C#float和double类型有效地将数字表示为按 2 的幂缩放的整数。您示例中的所有数字都转换为 2 的幂的倍数。
标签: c# floating-point storage precision