C++将双精度中的每个小数点制作成数组元素

C++ making each decimal in a double into array elements?

本文关键字:小数点 数组元素 双精度 C++      更新时间:2023-10-16

(这是为了练习(我正在尝试创建一个程序,该程序采用像 1.2041 这样的双精度数,并将每个小数点转换为数组中的一个元素。

通过循环,我希望数组的结尾如下所示:ar[0] = 0.2; ar[1] = 0.00; ar[2] = 0.004; ar[3] = 0.0001;

之后,我将把小数加在一起,最终得到 0,2041,但我似乎找不到任何方法来单独接触每个小数。

我尝试过乘减,但我似乎无法让它工作。

有谁知道一种简单的方法,可以将双精度中的每个小数变成数组中自己的单独元素?

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

当在double中用小数位表示十进制值时,通常使用二进制浮点表示表示,该值通常会四舍五入。例如,不可能使用 double 准确表示0.1。相反,将存储最接近的可表示值。当使用适当的算法来恢复十进制表示形式时,例如 Dragon4 或 Grisu(后者通常更快,但据我所知有时会回退到 Dragon4(,原始四舍五入会被考虑在内。这些算法在某种程度上是不平凡的。你可以在David Gay的dtoa.c中找到Dragon4变体的来源。您可能想在文章中查看更多详细信息 这里是龙:你甚至不知道自己遇到的问题的进步。

当您使用天真的方法试图推断每个数字时,您会得到一个值,但充其量您得到的是double实际表示的值。例如,您的值1.2041表示为 1.204099999999999948130380289512686431407928466796875 。查看值如何表示的最简单方法是使用 IEEE-754 分析:获取两个分析器,将值输入到第一个分析器中,采用十六进制表示形式(在您的情况下为 3FF343FE5C91D14E (,然后将其转储到第二个分析器中。它将显示double使用的确切十进制值。

如果你乘以 10^n,并将结果变成一个 int,你会得到整数,直到想要的小数。如果你得到这个数字的余数除以 10,你将只得到这个数字。

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

(double)((int)(number/pow(10,n))%10)/pow(10,n)

这应该可以解决问题。

注意:此代码需要"math.h",数字是整数,n 是小数。 n=1 是第一个小数。

注2:正如Dietmar Kühl所指出的,这段代码在最后一位小数点上存在问题,如下所示: http://ideone.com/xOracn 我正在寻找解决方法或修复程序。