2011-10-27 121 views
3

在下面的示例中,数字12345678.9在转换为字符串时会丢失准确性,因为它变为1.234568E + 07。我只需要一种方法来保留大浮点数的准确性。谢谢。System.Single精度与C#

Single sin1 = 12345678.9F; 
String str1 = sin1.ToString(); 
Console.WriteLine(str1); // displays 1.234568E+07 

回答

11

如果要保留十进制数,则应使用System.Decimal。就这么简单。 System.Single比更糟System.Double在按照文档:

缺省情况下,单值仅包含7的精度十进制数字,尽管最大的9位内部保持。

当您将其转换为字符串时,您不仅丢失了信息 - 您在第一行中丢失了信息。这不仅仅是因为你使用的是float而不是double - 这是因为你使用浮点数二进制点数。

十进制数0.1不能在二进制浮点系统精确地表示,不管你有多大使型...

查看我在floating binary pointfloating decimal point文章以了解更多信息。当然,有可能你的应该是使用double甚至float,而不是关心精度的损失 - 这取决于你想表达什么。但如果你真的关心保留十进制数字,然后使用基于十进制的类型。

3

你不能。就那么简单。在内存中你的号码是12345679。请尝试下面的代码。

Single sin1 = 12345678.9F; 
String str1 = sin1.ToString("r"); // Shows "all" the number 
Console.WriteLine(sin1 == 12345679); // true 
Console.WriteLine(str1); // displays 12345679 

技术上r装置(从MSDN引用)round-trip: Result: A string that can round-trip to an identical number.因此在现实中它没有显示所有的小数。它仅显示将其与其他可能的Single值区分开来所需的所有小数位数。如果要显示所有小数,请使用F20

如果您想更精确地使用double或更好使用decimalfloat具有它的精度。正如我们在意大利所说的“你不能从芜菁中挤压血液”