将float转换为Decimal,错误地丢失精度

时间:2012-03-26 15:55:52

标签: .net decimal string-formatting valueconverter

我有以下代码示例:

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

为什么这种精确度会丢失?指定的值是2 ^ 24,float可以表示的值。是否有任何.net库我可以使用它来使这个转换正常工作而不必滚动我自己的iCustomFormatter?

谢谢!

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

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

2 个答案:

答案 0 :(得分:3)

来自System.Single的文档:

  

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

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

答案 1 :(得分:1)

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