2013-04-09 44 views
1

我想將C#中的一個非常大的負數轉換爲正值,但是我知道當您點擊Decimal.MaxValue時Math.Abs​​可能會失敗。我知道這個數字非常大,但是通過我的網絡傳輸的數據可能有這個值或更大的可能性。我想知道是不是隻是在C#中翻轉數字的符號位。Math.Abs​​中的錯誤

這裏是我的代碼現在:

int bucket = Math.Abs(sdmpobject.SnapshotHandle.GetHashCode()) % numPartitions; 

這使用Math.Abs(),我只是想知道,如果有去只是翻轉符號位?

+1

GetHasCode返回一個int btw。 – ken2k 2013-04-09 12:20:29

+0

我猜他的意思是'MinValue'' -2,147,483,648',因此它的絕對不能表示爲int – V4Vendetta 2013-04-09 12:37:54

回答

3

GetHashCode()總是返回一個32位整數(int)。這是不可能超過Decimal.MaxValue
我假設使用GetHashCode()這裏是實際的錯誤。

+0

是的,我知道這一點,但是如果發生錯誤,我需要該值是正確的,不管它是什麼,它只是一個預防措施。 – jg943 2013-04-09 12:23:56

+0

@ user1765444:預防什麼?你在說什麼錯誤? – 2013-04-09 12:24:49

+0

如果由於某種原因,價值回報是數學中最大的負數。Abs()失敗,我的程序很難處理這個問題,我只在Nunit測試這個,這不應該發生在現實世界中,只是要小心。 – jg943 2013-04-09 12:32:13

0

這不是Abs失敗,它是超過的值的數值範圍。

因此,您可能需要採取另一種數字類型以避免出現問題 - 來自網絡的原始號碼是什麼類型/範圍?

0

在你的問題中你提到了decimal,但你給出的例子是int

另外:

它使用Math.Abs​​(),我只是想知道,如果有去只是翻轉符號位?

是的,有一種方法,但你不想只是翻轉符號位,因爲這會不會給你倒數值(即翻轉符號位上-1不會導致1 )

2

GetHashCode()將返回int而不是Decimal

Math.Abs(int)只會當通過int等於int.MinValue,所以你可以測試該條件明確地失敗:

int myValue = sdmpobject.SnapshotHandle.GetHashCode(); 
int absValue = myValue == int.MinValue ? int.MaxValue : Math.Abs(myValue); 
int bucket = absValue % numPartitions; 

這假設是可以接受的,你要通過一個針對罕見的情況被關閉。由於您的結果是在一個名爲「桶」的變量,也許你想糾正該關閉的情況的一個是這樣的:

int myValue = sdmpobject.SnapshotHandle.GetHashCode(); 
int bucket; 
if (myValue == int.MinValue) 
{ 
    bucket = ((int.MaxValue % numPartitions) + 1) % numPartitions; 
} 
else 
{ 
    int bucket = Math.Abs(myValue) % numPartitions; 
} 

你不能只是「翻牌」的所有值的原因,有簽名的數據類型通常可以保存比正數更多的負數,因此它們不能表示它們可以容納的最負數的絕對值。