c# - 通过计算零以科学计数法显示非常大或非常小的数字
问题描述
当小数点前的数字也为零时,我需要一种方法来获取小数点后的零数。因此,例如 0.00000000987654 将计算为 8,因为 0 后有 8 个零。将十进制数据类型转换为字符串,然后我可以用科学记数法将其显示为 9.87654E9。
我需要这样做的原因是我可以多次迭代非常小的数字,从而产生对计算器来说太高的结果。
因此例如 0.123456789 乘以 0.1 并迭代 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;
推荐阅读
- ios - 如何在tableview中增加和减少标签的值并在swift中从标签值中得出总价?
- c# - 登录按钮不适用于 Xamarin Android 应用
- python - 我希望随机数显示为小数点后 2 位,即使它以整数形式出现
- flutter - 如何在颤动中使用反射访问下划线属性?
- azure-functions - Cosmos DB 最小分区
- python - 如何在 Raspberry Pi3 上并行运行 TensorFlow 和其他一些处理
- javascript - 我们如何才能打开我的网站只有 chrome 浏览器?不应在 firefox、uc 浏览器等中打开
- java - 检测已编译的 jar 和 repo 中的代码之间的差异
- ios - 带有 UIButtons 的 Swift Keypath
- javascript - 如何在 textarea 中创建变量