我有以下代码示例:
float val = 16777216.0F;
var badResult = Convert.ToDecimal(val);
//badResult has value 16777220
为什么这种精确度会丢失?指定的值是2 ^ 24,float可以表示的值。是否有任何.net库我可以使用它来使这个转换正常工作而不必滚动我自己的iCustomFormatter?
谢谢!
编辑,这是我用作解决方案的丑陋代码
var goodResult = Convert.ToDecimal(((double)val));
答案 0 :(得分:3)
来自System.Single
的文档:
默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数。
给出的值确实对7位有效数字是正确的。虽然浮点数的精确值实际上是你给出的值,但转换为字符串似乎是合理的,只能显示已知正确的位数,最后一位数字可能四舍五入。
答案 1 :(得分:1)
转换为十进制工作正常;问题是float
类型(System.Single
)无法准确表示此值,因此它实际上是1.677722E+07
。如果您使用具有更高精度的double
(System.Double
),它将按预期工作。