在C#4.0中,以下演员表现非常出乎意料:
(decimal)1056964.63f
1056965
施放到双重效果很好:
(double)1056964.63f
1056964.625
(decimal)(double)1056964.63f
1056964.625
这是设计吗?
答案 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。