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

2024-11-09 00:07:55
推荐回答(2个)
回答(1):

据我所知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操作数。

回答(2):

超大的数据一般只能用字符串实现,当然算法要你自己实现了,比如说计算1000的阶乘这种,你可以自己用字符串string之类的来保存结果。