系统.c#的单精度
本文关键字:精度 单精度 系统 | 更新日期: 2023-09-27 18:12:28
在下面的示例中,数字12345678.9在转换为字符串时失去准确性,因为它变成了1.234568E+07。我只需要一种方法来保持大浮点数的精度。谢谢。
Single sin1 = 12345678.9F;
String str1 = sin1.ToString();
Console.WriteLine(str1); // displays 1.234568E+07
如果您想保留十进制数字,您应该使用System.Decimal
。就是这么简单。根据文档,System.Single
比System.Double
更差:
默认情况下,Single值只包含7位十进制数字的精度,尽管内部保持最大9位。
当你把它转换成字符串时,你不仅丢失了信息——你丢失的是第一行的信息。这不仅仅是因为您使用float
而不是double
-这是因为您使用的是浮动二进制点数。
十进制数0.1在二进制浮点数系统中不能精确地表示,无论你把类型设置多大
有关更多信息,请参阅我关于浮点二进制和浮点小数点的文章。当然,有可能应该使用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
具有它所具有的精度。正如我们在意大利所说的"Non puoi spremere sangue da una rapa"(你不能从萝卜中挤出血)
您也可以为您的目的编写一个IFormatProvider -但是精度不会得到任何改善,除非您使用不同的类型。本文可能有所帮助- http://www.csharp-examples.net/string-format-double/