Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将双精度中的每个十进制数转换为数组元素?_C++_Arrays_Double_Decimal_Elements - Fatal编程技术网

C++ C++;将双精度中的每个十进制数转换为数组元素?

C++ C++;将双精度中的每个十进制数转换为数组元素?,c++,arrays,double,decimal,elements,C++,Arrays,Double,Decimal,Elements,(这是一个练习)我正在尝试创建一个程序,该程序采用双精度,比如1.2041,并将每个十进制数转换为数组中的一个元素 通过一个循环,我希望数组以如下方式结束:ar[0]=0.2;ar[1]=0.00;ar[2]=0.004;ar[3]=0.0001 在那之后,我将把小数相加,最后得到02041,但我似乎找不到任何方法来单独计算每个小数 我试过乘法和减法,但似乎都没用 有人知道一种简单的方法,可以将双精度中的每个十进制数转换为数组中各自独立的元素吗?除非您热衷于实现Dragon4(请参阅Guy L.

(这是一个练习)我正在尝试创建一个程序,该程序采用双精度,比如1.2041,并将每个十进制数转换为数组中的一个元素

通过一个循环,我希望数组以如下方式结束:
ar[0]=0.2;ar[1]=0.00;ar[2]=0.004;ar[3]=0.0001

在那之后,我将把小数相加,最后得到02041,但我似乎找不到任何方法来单独计算每个小数

我试过乘法和减法,但似乎都没用


有人知道一种简单的方法,可以将双精度中的每个十进制数转换为数组中各自独立的元素吗?

除非您热衷于实现Dragon4(请参阅Guy L.Steele Jr.和Jon L.White的“如何准确打印浮点数”),否则最好将
双精度
值格式化为字符串,例如。,使用
std::to_string()
,并从中计算相应的数字值[近似值]


当在通常使用二进制浮点表示法的
双精度
中用小数位数表示十进制值时,该值通常会四舍五入。例如,不可能使用
double
精确表示
0.1
。相反,将存储最接近的可表示值。当使用适当的算法恢复十进制表示时,例如Dragon4或Grisu(后者通常更快,但据我所知,有时会退回到Dragon4),会考虑原始舍入。这些算法有些繁琐。你可以在大卫·盖伊的《龙4》中找到变异的来源。您可能希望在本文中了解更多详细信息


当您使用一种简单的方法试图推断每个数字时,您将得到一个值,但充其量只能得到实际由
double
表示的值。例如,您的值
1.2041
表示为
1.20409999999494830380289512686431407928466796875
。查看值如何表示的最简单方法是使用:获取两个分析器,在第一个分析器中输入值,采用十六进制表示法(在您的示例中为
3FF343FE5C91D14E
),然后将其转储到第二个分析器中。它将显示双精度

所使用的精确十进制值,除非您渴望实现Dragon4(请参阅Guy L.Steele Jr.和Jon L.White的“如何准确打印浮点数”),否则最好将双精度值格式化为字符串,例如,使用
std::to_string()
,并由此计算相应的数字值[近似值]


当在通常使用二进制浮点表示法的
双精度
中用小数位数表示十进制值时,该值通常会四舍五入。例如,不可能使用
double
精确表示
0.1
。相反,将存储最接近的可表示值。当使用适当的算法恢复十进制表示时,例如Dragon4或Grisu(后者通常更快,但据我所知,有时会退回到Dragon4),会考虑原始舍入。这些算法有些繁琐。你可以在大卫·盖伊的《龙4》中找到变异的来源。您可能希望在本文中了解更多详细信息


当您使用一种简单的方法试图推断每个数字时,您将得到一个值,但充其量只能得到实际由
double
表示的值。例如,您的值
1.2041
表示为
1.20409999999494830380289512686431407928466796875
。查看值如何表示的最简单方法是使用:获取两个分析器,在第一个分析器中输入值,采用十六进制表示法(在您的示例中为
3FF343FE5C91D14E
),然后将其转储到第二个分析器中。它将显示双精度

所使用的精确十进制值。如果乘以10^n,并将结果转换为整数,则将得到所需十进制数的整数。如果你把这个数的余数除以10,你只会得到这个数

然后,除以10^n,得到小数点:

(double)((int)(number/pow(10,n))%10)/pow(10,n)
这应该能奏效

注意:此代码需要“math.h”,number是整数,n是小数。n=1是第一个小数点


注2:正如Dietmar Kühl所指出的,这段代码的最后一个小数点有问题,如图所示:我正在寻找解决方法或修复方法。

如果乘以10^n,并将结果转换为整数,则将得到所需小数点的整数。如果你把这个数的余数除以10,你只会得到这个数

然后,除以10^n,得到小数点:

(double)((int)(number/pow(10,n))%10)/pow(10,n)
这应该能奏效

注意:此代码需要“math.h”,number是整数,n是小数。n=1是第一个小数点


注2:正如Dietmar Kühl所指出的,这段代码的最后一个小数点有问题,从这里可以看出:我正在寻找解决方法或修复方法。

ar[0]=0,2
没有将0.2分配给数组的第0个元素。这是逗号运算符;它将
0
分配给数组元素,然后计算
2
(这是一个无操作)。使用
作为小数点。还有,
fmod()
(和/或
modf()
)。哦,我没看到问题中有打字错误。不是在代码中写的^^^谢谢你的输入也包括coma(,)吗?现在编辑它。我的输入不包括comma@user3797804事实上,这并不重要。提示:这与从整数中提取数字的方法相同。重复的除法和模运算是关键。
ar[0]=0,2
不会将0.2分配给数组的第0个元素。这是逗号运算符;它将
0
分配给