在下面的示例中,数字12345678.9在转换为字符串时会丢失准确性,因为它变为1.234568E + 07。我只需要一种方法来保留大浮点数的准确性。谢谢。System.Single精度与C#
Single sin1 = 12345678.9F;
String str1 = sin1.ToString();
Console.WriteLine(str1); // displays 1.234568E+07
在下面的示例中,数字12345678.9在转换为字符串时会丢失准确性,因为它变为1.234568E + 07。我只需要一种方法来保留大浮点数的准确性。谢谢。System.Single精度与C#
Single sin1 = 12345678.9F;
String str1 = sin1.ToString();
Console.WriteLine(str1); // displays 1.234568E+07
如果要保留十进制数,则应使用System.Decimal
。就这么简单。 System.Single
比更糟System.Double
在按照文档:
缺省情况下,单值仅包含7的精度十进制数字,尽管最大的9位内部保持。
当您将其转换为字符串时,您不仅丢失了信息 - 您在第一行中丢失了信息。这不仅仅是因为你使用的是float
而不是double
- 这是因为你使用浮点数二进制点数。
十进制数0.1不能在二进制浮点系统精确地表示,不管你有多大使型...
查看我在floating binary point和floating decimal point文章以了解更多信息。当然,有可能你的应该是使用double
甚至float
,而不是关心精度的损失 - 这取决于你想表达什么。但如果你真的做关心保留十进制数字,然后使用基于十进制的类型。
你不能。就那么简单。在内存中你的号码是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
或更好使用decimal
。 float
具有它的精度。正如我们在意大利所说的“你不能从芜菁中挤压血液”
你也可以为你的目的写一个IFormatProvider--但是除非你的精确度没有得到提高使用不同的类型。 这篇文章可能会有所帮助 - http://www.csharp-examples.net/string-format-double/