从大双值(C#)获取字符串

时间:2016-11-02 09:56:52

标签: c# double tostring

无法找到将double转换为字符串的简单方法。我需要转换大数而不失真。如:

FALSE

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

ID velocity peak 1 1 10 FALSE 2 1 11 FALSE 3 1 15 FALSE 4 1 28 TRUE 5 2 33 FALSE 6 2 32 FALSE 7 2 33 FALSE 8 2 38 FALSE 9 2 21 FALSE 10 2 10 FALSE 11 2 3 FALSE 12 2 6 FALSE 13 2 9 FALSE 14 2 21 TRUE** 15 2 54 TRUE*** 16 2 44 TRUE** 17 2 31 TRUE** 18 2 15 TRUE** 19 2 29 TRUE** 20 2 7 FALSE 21 3 38 TRUE 22 3 29 FALSE

$json_res = buildJson(); $json_res = json_decode($json_res,true); echo count($json_res); for($i = 0; $i < count($json_res); $i++){ $item = $json_res[$i]; }

有任何想法可以做到吗?

3 个答案:

答案 0 :(得分:8)

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

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

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

修改

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

答案 1 :(得分:2)

首先:11111111111111111111111对于double值来说是大的,而且这个值也是1.111111111111111111111,因为双倍最大小数是17。

  

默认情况下,Double值包含15个十进制数字的精度,   虽然内部最多保留17位数字。

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

答案 2 :(得分:0)

一般情况中,您无法执行此操作:用户可以很好地输入,例如 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceOf ViewHolder1){ (ViewHolder1) holder.getLabel1().setText(mDataset.get(position).getName()); } else { try { Resources res = context.getResources(); int resourceId = res.getIdentifier(mDataset.get(position).getImg(), "mipmap", context.getPackageName()); (ViewHolder2) holder.getImageView().setImageResource(resourceId); } catch (Exception e) {} } }

  • 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("#######################"); 64位来存储值,这就是为什么大数不可避免地会出现失真的原因:

double

您可能希望// 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