无法找到将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];
}
有任何想法可以做到吗?
答案 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