System.Single准确性与C#

use*_*345 3 c# floating-point rounding

在下面的示例中,数字12345678.9在转换为字符串时失去准确性,因为它变为1.234568E + 07.我只需要一种方法来保持大浮点数的准确性.谢谢.

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

Jon*_*eet 12

如果要保留十进制数,则应使用System.Decimal.就这么简单.System.SingleSystem.Double根据文件更糟糕的是:

默认情况下,Single值仅包含7个十进制数字的精度,但内部最多保留9位数.

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

无论您使用多大的类型,十进制数0.1都无法在二进制浮点系统中准确表示...

有关更多信息,请参阅有关浮点二进制点浮点小数点的文章.当然,它可能是你应该使用double,甚至float,只是不关心的精度损失-这取决于你想要代表什么.但如果你真的关心保留小数位数,然后使用一个基于十进制类型.