【问题标题】:Get string from large double value(C#)从大的双精度值中获取字符串(C#)
【发布时间】:2017-03-15 14:10:47
【问题描述】:

找不到将双精度转换为字符串的简单方法。我需要在不失真的情况下转换大量数字。如:

double d = 11111111111111111111;
string s = d.ToString();
Console.WriteLine(s);
//1.11111111111111E+19

如何从与用户输入完全相同的双精度值中获取字符串值。

11111111111111111111111 => "11111111111111111111111"

1.111111111111111111111 => "1.111111111111111111111"

有什么想法可以做到吗?

【问题讨论】:

标签: c# double tostring


【解决方案1】:

double 是浮点类型。所以它的准确性有限。在您的示例中,您可以执行以下操作:

double d = 11111111111111111111;
string s = d.ToString("F0");
Console.WriteLine(s);

但正如您所见,这将输出11111111111111100000 而不是11111111111111111111,因此在此过程中失去了准确性。所以这里的答案是为工作使用正确的类型。如果需要字符串,请使用字符串变量来存储值。

编辑

This was the question 我试图找到解释浮点数学问题的方法。感谢@GSerg

【讨论】:

  • 我可以改用哪种类型?
  • 这取决于您要达到的目标。你没有告诉我们任何关于这个过程的事情。
  • 感谢您的回答。现在我意识到问题所在了。双精度只有 15 位数字,其余都是垃圾或零或指数。
【解决方案2】:

首先:11111111111111111111111 对于双精度值来说太大了,这个值也是:1.111111111111111111111 因为双精度最大十进制长度为 17。

默认情况下,Double 值包含 15 个十进制数字的精度, 尽管内部维护了最多 17 位数字。

因此,您应该使用BigInteger,然后使用ToString 来格式化输出。
nuget 目录中还有一个名为 BigRational 的库,从未使用过,似乎处于 Beta 阶段,但可能有助于解决此问题。

【讨论】:

  • 双值呢?
  • 不幸的是,C# 中没有 BigDouble 等价物,因此您必须自己管理小数部分。
【解决方案3】:

一般情况中,你不能这样做:用户可以很好地输入,比如123,在很多方面

  • 123
  • 123.00
  • 1.23e2
  • 12.3E1
  • 123.0e+00
  • 1230e-1

等等。当您将用户输入转换为 double 时,您会丢失初始格式:

string userInput = ...

// double is just 123.0 whatever input has been
double value = double.Parse(userInput);

如果你想删除指数如果可能的话你可以

double value = 11111111111111111111;

string result = value.ToString("#######################");

请注意,double64 位 来存储值,这就是为什么大数不可避免地会出现失真:

// possible double, which will be rounded up
double big = 123456789123456789123456789.0;

// 1.2345678912345679E+26
Console.WriteLine(big.ToString("R"));
// 123456789123457000000000000
Console.WriteLine(big.ToString("###########################")); 

你可能想要BigInteger而不是double

using System.Numerics;

...

BigInteger value = BigInteger.Parse("111111111111111111111111111111111"); 

// 111111111111111111111111111111111
Console.WriteLine(value.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2013-12-28
    • 2022-11-21
    • 2016-06-11
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多