在C#中将float转换为十进制会丢失精度

Yur*_*rik 5 .net c# floating-point casting decimal

在C#4.0中,以下转换表现非常出乎意料:

(decimal)1056964.63f
1056965
Run Code Online (Sandbox Code Playgroud)

铸造到双重工作就好了:

(double)1056964.63f
1056964.625

(decimal)(double)1056964.63f
1056964.625
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?

Jon*_*eet 10

问题在于您的初始值 - float无论如何仅精确到7位有效小数位:

float f = 1056964.63f;
Console.WriteLine(f); // Prints 1056965
Run Code Online (Sandbox Code Playgroud)

所以第二个例子在某些方面是意想不到的.

现在确切的f是1056965.625,但这是从大约1056964.563到1056964.687的所有值给出的值 - 所以即使".6"部分也不总是正确的.这就是为什么System.Single国家的文件:

默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数.

转换到时double,额外的信息仍然保留,因为它可以保留它而不用"解释"它 - 将其转换为十进制形式(打印或decimal类型)通过代码知道它不能"信任"最后两位数.