c# - 通过计算零位以科学记数法显示非常大或非常小的数字

标签 c#

当小数点前的数字也为零时,我需要一种方法来获取小数点后的零数。因此,例如 0.00000000987654 将计算为 8,因为在 0 之后有 8 个零。将十进制数据类型转换为字符串,然后我可以在科学记数法中将其显示为 9.87654E9。

我需要这样做的原因是我可以多次迭代非常小的数字,从而产生对于计算器来说太高的结果。

例如 0.123456789 乘以 0.1 并迭代 a 1000 次。 (0.123456789 * 0.1 * 0.1 * 0.1 * 0.1 ......) 在 1.234567890000000000000000000E-1001 处计算,使用具有完整 28 位精度的十进制数据类型并以科学记数法显示

我在使用 Factorials 时能够实现这一目标。例如,1000 的阶乘是 1000 x 999 * 998 * 997 * 996 ....一直到 0。这个数字对于计算器来说太高了,所以我使用迭代来实现科学计数法中 28 位精度的结果.

对于非常大的数字,我是成功的。我通过获取句点之前的位数来实现这一点:

    static int Get_Digits_Before_Period(decimal Large_Number)
    {
        decimal d = decimal.Floor(Large_Number < 0 ? decimal.Negate(Large_Number) : Large_Number);
        // 0.xyz should return 0, therefore a special case
        if (d == 0m)
            return 0;
        int cnt = 1;
        while ((d = decimal.Floor(d / 10m)) != 0m)
            cnt++;
        return cnt;
    }

我现在需要一种类似的方法,但需要一种方法来获取句点后的零数。

最佳答案

十进制的指数范围是0~-28,不能代表1.234567890000000000000000000E-1001这样的数,所以只说明有效范围内的数。

要计算小数的零,可以先取小数的整数和指数部分

var number = 0.00000000987654m;
var bits = decimal.GetBits(number); //0~2 are integer part.
var exponent = (bits[3] & 0xff0000) >> 16;

然后将指数减去整数的有效数字以获得句点后的零计数。

var zeros = exponent;
for(int i = 0; i <= 2; i++)
{
      if(bits[i] != 0)
         zeros -= (int)Math.Log10(bits[i]) + 1;
}
if(zeros < 0)
    zeros = 0;

关于c# - 通过计算零位以科学记数法显示非常大或非常小的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55427568/

相关文章:

c# - xml 中的 DataContract/DataMember 多个元素

c# - "The SMTP host was not specified."- 但它是指定的?

c# - Visual Studio Express 2012 未在 Release 文件夹中构建 exe

c# - 在具有大量流量的异步 ASP.NET Web API 中,将 ConfigureAwait 设置为 false 会产生什么影响?

javascript - GridView 页面索引更改事件导致 JavaScript 运行时错误

c# - 从 DataTable 填充类

c# - WebAPI 类的外键关系

c# - Winpcap 简单问题——如何向指定的ip/端口发送数据包?

c# - LINQ 是将 SQL Server 中的所有项目加载到内存中还是仅加载到 block 中?

c# - 在 PropertyGrid 中使用自定义颜色选择器对话框