c#使用double时的大数字表示

Posted

技术标签:

【中文标题】c#使用double时的大数字表示【英文标题】:c# big numbers representation when using double 【发布时间】:2013-11-01 13:53:27 【问题描述】:

我有这个程序,它从一个双变量中获取所有数字,删除小数点和减号,并分别添加每个数字。这是:

static void Main(string[] args)
    

            double input = double.Parse(Console.ReadLine());

                char[] chrArr = input.ToString().ToCharArray();

                input = 0;

                foreach (var ch in chrArr)
                
                    string somestring = Convert.ToString(ch);
                    int someint = 0;
                    bool z = int.TryParse(somestring, out someint);
                    if (z == true)
                    
                        input += (ch - '0');
                    
                

问题是,例如,当我输入“9999999999999999999999999999999 ....”等时,它被表示为1.0E+254,所以我的程序只是添加1+0+2+5+4并完成。有没有有效的方法可以使这项工作正常进行?我尝试使用双精度字符串 instad,但它工作得太慢了..

【问题讨论】:

您应该知道,double 首先将无法保存该号码。改为寻找BigDecimal ***.com/questions/1319191/… Double to string conversion without scientific notation的可能重复 所以你的基本目标是将所有数字加起来形成一个无限的字符串? 【参考方案1】:

您不能将 "9999999999999999999999999999999..." 存储为双精度 - double 只有 15 或 16 位精度。编译器会为您提供 可以 表示的最接近您所要求的双精度,即 1E254

我会研究为什么使用 string 很慢,或者使用 BigInteger

【讨论】:

【参考方案2】:

正如其他答案所表明的那样,存储的内容不会完全是输入的数字,而是可以表示的最接近的双精度值。

如果您想检查所有数字,请使用F0 作为format string。

char[] chrArr = input.ToString("F0").ToCharArray();

【讨论】:

【参考方案3】:

您可以在 Decimal 中存储更大的数字,因为它是 128 位数字,而 Double 是 64 位。

但显然还是有限制的。

【讨论】:

以上是关于c#使用double时的大数字表示的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 除以表示为字符串的大数字

求两个大整数相乘的积,数字长度在127个字符之内。

java的double的大数值时 怎么才能不显示成科学计数法

java中有关大数的操作

解决后端返回数据中的大数字问题(使用第三方包json-bigint )

java中的大数值