我想創建一個函式,一旦對值求和,就可以計算位數
假設我有這個陣列
byte[] array = new byte[] { 200, 100, 200, 250, 150, 100, 200 };
總結一下,您將獲得 1200 的值
您可以使用這些功能獲得位數
Math.Floor(Math.Log10(1200) 1) // 4
但是如果我總結起來并且陣列中的值太多,我會得到一個整數溢位
public decimal countDigits(byte[] array)
{
decimal count = array[0];
for (int i = 1; i < array.Length; i )
{
count = Math.Log10(Math.Pow(count, 10) array[i]);
}
return count;
}
這確實給出了我想要的正確輸出,但是如果計數大于 28.898879583742193 (log10(decimal.MaxValue)),則會導致整數溢位
uj5u.com熱心網友回復:
讓我們提出一個簡單的問題:我們應該對多少bytes 求和才能使整數溢位long?答案很簡單:在最壞的情況下(所有位元組都具有最大可能值)它需要
long.MaxValue / byte.MaxValue 1 = 36170086419038337 (~3.61e16) bytes
我們要總結多長時間?即使只需要1cpu tick ( ~ 0.1ns) 從陣列中獲取專案并求和,我們也需要
41天(或82天)的~3.6e6秒數。如果不是您的情況(請注意,當我們至少需要時,C# 中的陣列不能超過專案),那么您可以將總和為(或):ulong2.1e93.6e16longulong
public static int countNumbers(byte[] array) {
ulong sum = 0;
foreach (byte item in array)
sum = item;
// How many digits do we have?
return sum.ToString().Length;
}
uj5u.com熱心網友回復:
i want to make a function that counts the amount of digits once the value is sumed up
public decimal countNumbers(byte[] array)
{
// sum the values...
decimal sum = 0;
foreach (byte value in array)
{
sum = value
}
// ... then "count" the digits.
return Math.Floor(Math.Log10(sum) 1);
}
這將是代碼,但是您的問題、提供的示例和您的方法的命名都暗示著不同的事情,所以看看這是否有幫助,如果有幫助,請繼續您的命名。
uj5u.com熱心網友回復:
有一種BigInteger資料型別可以總結任意(整數)值。它甚至有一個Log10方法,因此它的作業方式與標準整數變數非常相似。唯一的限制是 的結果BigInteger.Log10必須小于Double.MaxValue,但這聽起來像是一個合理的限制。(10^1E308=10^10^308 是一個非常大的數字)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526719.html
標籤:C#数学
