1

我有以下代码示例:

        float val = 16777216.0F;
        var badResult = Convert.ToDecimal(val);
        //badResult has value 16777220

为什么这种精度会丢失?指定的值为 2^24,浮点数可以表示的值。有没有我可以使用的 .net 库来使这种转换正常工作,而不必滚动我自己的 iCustomFormatter?

谢谢!

编辑,这是我用作解决方案的丑陋代码

var goodResult = Convert.ToDecimal(((double)val));
4

2 回答 2

3

从文档中System.Single

默认情况下,Single 值仅包含 7 位精度的十进制数字,尽管内部维护最多 9 位数字。

给出的值确实对 7 位有效数字是正确的。虽然浮点数的确切值实际上是您给出的值,但转换为字符串似乎是合理的,只显示已知正确的位数,最后一位可能会四舍五入。

于 2012-03-26T15:59:51.270 回答
1

转换为十进制工作正常;问题是float类型 ( System.Single) 不能准确地表示这个值,所以它实际上是1.677722E+07. 如果您使用具有更高精度的double( System.Double),它将按预期工作。

于 2012-03-26T16:00:39.017 回答