簡體   English   中英

確定小數是否可以存儲為int32

[英]Determine if a decimal can be stored as int32

我正在做一些自定義序列化,為了節省一些空間,我希望將小數序列化為int,如果可能的話值。 性能是一個問題,因為我正在處理大量數據。 我目前使用的方法是:

if ((value > Int32.MinValue) && (value < Int32.MaxValue) && ((valueAsInt = Decimal.ToInt32(value)) == value))
{
    return true;
}

這可以改善嗎?

您的失效標准是:

1)它是否大於MaxValue?

2)它是否小於MinValue?

3)它是否包含分數成分?

聽起來你已經覆蓋了它們。 我的實施將是:

public bool IsConvertibleToInt(decimal value)
{
    if(value > int.MaxValue)
       return false;

    if(value < int.MinValue)
       return false;

    if(Math.Floor(value) < value && Math.Ceiling(value) > value)
       return false;

    return true;
}

這個怎么樣。 我認為它應該采取更少的操作(至少少數比較):

    return (value == (Int32)value);

還要記住,如果if語句只返回一個布爾值,則可以返回比較。 僅這一點可能會使它更快(除非編譯器已經為此優化)。 如果必須使用if語句,則可以類似地執行此操作:

    if (value == (Int32)value)
    {
        //Do stuff...
    return true;
    }
    else
    {
        //Do stuff...
        return false;
    }

編輯:我意識到這實際上不起作用。 我在想Int32演員只會復制小數的前32位,留下任何剩余的位(而不是拋出異常),但唉,它沒有那樣工作(更不用說它會錯了)所有負面價值)。

這取決於你擁有或真正關心的小數位數。 如果你可以說我只關心最多3個小數位,那么你可以在int32中存儲的最大數字是int.MaxValue / 1000.如果你只使用正數,那么你可以使用uint獲得更高的數字。 在任何情況下,這樣做的方法是始終為小數保留空間並使用* 1000對它們進行編碼,使用/ 1000將它們解碼為/從十進制進行解碼。

你有任何負面價值觀嗎? 我猜是的,因為你有MinValue檢查,否則你可以跳過它。 您甚至可以使用unsigned int,它允許您將更多的double值轉換為int。

編輯:此外,如果您有更多正數,您可以交換前兩個條件。 這樣,第一個最有可能失敗,減少了比較總數。

難道你不能只做以下事情:

if(Decimal.ToInt32(value) == value)
{
     return true;
}

不是.net的專家,但我認為這應該是它所需要的。 此外,由於最小值/最大值也有效,因此兩個比較運算符應為“或相等”。

編輯:正如評論中所指出的,這將引發異常。 您可以嘗試捕獲異常並返回false,但此時自己進行最小/最大測試可能要快得多。

不需要“valueAsInt =”。 我相信(Decimal.ToInt32(value)== value))通過少一個任務獲得相同的結果。 您是否將valueAsInt用作某種輸出參數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM