将小数转换为双精度时,有时会出现一些意外的截断。
例如:

        decimal dec = -96.31614743511301m;
        double dbl = Convert.ToDouble(dec);  // dbl = -96.316147435113, why?


对于其他值,它按预期工作:

        decimal dec2 = -96.269592225955307m;
        double dbl2 = Convert.ToDouble(dec2); // dbl2 = -96.269592225955307, expected


请注意,第二个有效的示例实际上比第一个无效的示例具有更多的小数位。同样,使用以下卷积代码可以将第一个值成功转换为双精度:

        dbl = Convert.ToDouble(dec.ToString()); // dbl = -96.31614743511301, expected


那么为什么在第一个示例中双精度值被截断呢?

最佳答案

小数和双精度以不同的精度不同地存储...请参见此处-Difference between decimal, float and double in .NET?

10-08 11:19