作业帮 > 数学 > 作业

c#怎么储存更大的数字?double和long储存的数字范围的确很广,但总有上限,比如我计算√2

来源:学生作业帮 编辑:神马作文网作业帮 分类:数学作业 时间:2024/11/18 14:19:41
c#怎么储存更大的数字?double和long储存的数字范围的确很广,但总有上限,比如我计算√2
c#怎么储存更大的数字?
double和long储存的数字范围的确很广,但总有上限,比如我计算√2,对于这个无限不循环小数,我要精确到小数点后几百亿个数字,double肯定达不到,可怎样达到?
c#怎么储存更大的数字?double和long储存的数字范围的确很广,但总有上限,比如我计算√2
据我所知C#最精确的类型是decimal,最多精确28位有效数据,按你的要求,只能手动实现高精度,而且精确到几百亿即使银河那个级别的大型机也要跑到人类毁灭,而且在大型机上是不会使用C#的.
以下内容摘自《C#语言规范5.0》的4.1.7章
decimal 类型
decimal类型是 128 位的数据类型,适合用于财务计算和货币计算.decimal类型可以表示具有 28 或 29 个有效数字、从 1.0 × 10−28到大约 7.9 × 1028 范围内的值.
decimal类型的有限值集的形式为 s × c × 10-e,其中符号 s是 0 或 1,系数c由 0 ≤ c < c < 296 给定,小数位数 e满足 0 ≤ e ≤ 28.decimal类型不支持有符号的零、无穷大或 NaN.decimal可用一个以 10 的幂表示的 96 位整数来表示.对于绝对值小于 1.0m的 decimal,它的值最多精确到第 28位小数.对于绝对值大于或等于 1.0m的 decimal,它的值精确到小数点后第28 或 29 位.与 float和 double数据类型相反,十进制小数数字(如 0.1)可以精确地用 decimal表示形式来表示.在 float和 double表示形式中,这类数字通常变成无限小数,使这些表示形式更容易发生舍入错误.
如果二元运算符的一个操作数为 decimal类型,则另一个操作数必须为整型或 decimal类型.如果存在一个整型操作数,它将在执行运算前转换为 decimal.
decimal类型值的运算结果是这样得出的:先计算一个精确结果(按每个运算符的定义保留小数位数),然后舍入以适合表示形式.结果舍入到最接近的可表示值,当结果同样地接近于两个可表示值时,舍入到最小有效位数位置中为偶数的值(这称为“银行家舍入法”).零结果总是包含符号 0 和小数位数 0.
如果十进制算术运算产生一个绝对值小于或等于 5 × 10-29 的值,则运算结果变为零.如果 decimal算术运算生成的结果对于 decimal格式来说太大,则将引发 System.OverflowException.
与浮点型相比,decimal类型具有较高的精度,但取值范围较小.因此,从浮点型到 decimal的转换可能会产生溢出异常,而从 decimal到浮点型的转换则可能导致精度损失.由于这些原因,在浮点型和 decimal之间不存在隐式转换,如果没有显式地标出强制转换,就不可能在同一表达式中同时使用浮点操作数和 decimal操作数.
再问: 几百亿是不可能,我就是想问要小数点后50位。 比如Math.sqrt(2); 返回double,我至少要小数点后50位,怎么办?
再答: 我大概写了一个简单的高精度,原理很简单:
若x^2<y 则 x< sqrt(y)
代码如下 在vs2013 .net4.5 运行正常