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

时间:2011-11-27 07:39:12

标签: c# .net casting floating-point decimal

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

(decimal)1056964.63f
1056965

施放到双重效果很好:

(double)1056964.63f
1056964.625

(decimal)(double)1056964.63f
1056964.625

这是设计吗?

2 个答案:

答案 0 :(得分:10)

问题在于您的初始值 - float只能精确到7位有效十进制数字:

float f = 1056964.63f;
Console.WriteLine(f); // Prints 1056965

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

现在f中的完全值是1056965.625,但这是从大约1056964.563到1056964.687的所有值的值 - 所以即使“.6”部分也不总是正确的。这就是System.Single状态的文档:

的原因
  

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

当你转换为double时,额外的信息仍然保留,因为这可以保留它而不“解释”它 - 将其转换为十进制形式(打印或{{1} } type)通过代码知道它不能“信任”最后两位数字。

答案 1 :(得分:-1)

这是设计的。 Float可以保持你的号码[编辑]非常准确[ / edit ],但是为了转换目的,它将它舍入到最接近的整数,因为只有少数可表示的浮点值在您的数字和整数之间(1056964.75和1056964.88)。请参阅SSCLI中的COMNumber :: FormatSingle和COMDecimal :: InitSingle。