2012-03-26 78 views
1

我有下面的代码示例:转换浮到小数,错误地失去精度

 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

如果你在使用数学,一路使用浮动/双打。如果您使用货币,则一路使用小数。为什么你需要在它们之间进行转换? – 2012-03-26 15:58:13

+0

另请参阅http://ideone.com/w1sTm – 2012-03-26 16:00:44

+0

@graham。不幸的是,我正在从硬件返回代码。 – greggorob64 2012-03-26 17:24:28

回答

3

从文档System.Single

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

给出的值对于7位有效数字确实是正确的。尽管float的值实际上是你给出的值,但对于字符串转换来说,似乎是合理的,只显示已知是正确的位数,最后一位可能是四舍五入的。

+0

那么,我发现的临时解决方案是这样的: var goodResult = Convert.ToDecimal(((double)val)); 这种转换工作,但似乎很好,愚蠢。我知道浮点数只适用于7位数字,但此代码返回正确的值。我可以发生生锈的代码吗? – greggorob64 2012-03-26 17:30:36

+0

@ greggorob64:说实话,我不会开始在'float' /'double'和'decimal'之间转换。这几乎总是*一个迹象表明你早先出错了。虽然我可以理解为什么在这个特定案例中起作用,但在我说出它是否会按你想要的做法之前,你需要非常精确地知道你想要在各种角落案件中得到什么。如果你知道它不值得信任,我不明白你为什么要*第8位有效数字。 – 2012-03-26 17:36:51

+0

感谢您的输入。我有一个传感器返回一个浮点数(无法控制它),我们需要8个数字的值,因为如果数字超过1mil,它的一个错误代码,设计和2^24读出它发出校准。这是他们的糟糕的设计,但我需要将它变成小数点以备将来存储。 – greggorob64 2012-03-26 17:56:46

1

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

相关问题