Класс помощника Active Directory

Ваша интуиция верна, вы МОЖЕТЕ потерять точность при преобразовании int в float. Однако это не так просто, как представлено в большинстве других ответов.

В Java FLOAT использует 23-битную мантиссу, поэтому у целых чисел больше 2 ^ 23 их младшие биты будут усечены. (из поста на этой странице)

Не соответствует действительности.
Пример: здесь целое число больше 2 ^ 23, которое преобразуется в число с плавающей точкой без потерь:

int i = 33_554_430 * 64; // is greater than 2^23 (and also greater than 2^24); i = 2_147_483_520
float f = i;
System.out.println("result: " + (i - (int) f)); // Prints: result: 0
System.out.println("with i:" + i + ",  f:" + f);//Prints: with i:2_147_483_520,  f:2.14748352E9

Следовательно, неверно, что целые числа больше 2 ^ 23 будут иметь свои младшие значащие биты усеченный. [+1122]

Лучшее объяснение, которое я нашел, это здесь:
Число с плавающей точкой в ​​Java является 32-битным и представлено:
знак * мантисса * 2 ^ экспонента
знак * (от 0 до 33_554_431) * 2 ^ (- от 125 до +127)
Источник: http://www.ibm.com/developerworks/java/library/j -math2 / index.html

Почему это проблема?
Создается впечатление, что вы можете определить, есть ли потеря точности из int плавать , просто посмотрев, насколько велико int.
Я особенно видел экзаменационные вопросы по Java, где спрашивают, превратится ли большое int в float без потерь.

Кроме того, иногда люди склонны думать, что будет потеря точности от int до float:
, когда int больше чем: 1_234_567_890 не верно (см. Counter - пример выше)
, когда int больше, чем: 2 экспонента 23 (равно: 8_388_608) не верно
, когда int больше чем: 2 показатель степени 24 (равно: 16_777_216) не соответствует действительности

Заключение
Преобразования из достаточно больших целых чисел в числа с плавающей точкой МОГУТ потерять точность.
Невозможно определить, будут ли убытки, просто посмотрев , насколько велико значение int (т.е. не пытаясь углубиться в реальное представление с плавающей точкой).

5
задан Saif Khan 12 June 2009 в 00:23
поделиться

3 ответа

В .NET 3.5 вы хотите заглянуть в System.DirectoryServices.AccountManagement . Для более ранних версий System.DirectoryServices есть то, что вам нужно, но это немного больше работы.

using (var context = new PrincipalContext( ContextType.Domain ))
{
      var valid = context.ValidateCredentials( username, password );
      using (var user = UserPrincipal.FindByIdentity( context,
                                                      IdentityType.SamAccountName,
                                                      username ))
      {
          var groups = user.GetAuthorizationGroups();
      }
}
10
ответ дан 18 December 2019 в 12:01
поделиться

Вот пример кода, который я использовал:

using System.DirectoryServices;

public static string GetProperty(SearchResult searchResult, 
    string PropertyName)
{
    if (searchResult.Properties.Contains(PropertyName))
        return searchResult.Properties[PropertyName][0].ToString();
    else
        return string.Empty;
}

public MyCustomADRecord Login(string UserName, string Password)
{
    string adPath = "LDAP://www.YourCompany.com/DC=YourCompany,DC=Com";

    DirectorySearcher mySearcher;
    SearchResult resEnt;

    DirectoryEntry de = new DirectoryEntry(adPath, UserName, Password, 
        AuthenticationTypes.Secure);
    mySearcher = new DirectorySearcher(de);

    string adFilter = "(sAMAccountName=" + UserName + ")";
    mySearcher.Filter = adFilter;

    resEnt = mySearcher.FindOne();


    return new MyCustomADRecord()
    {
        UserName = GetProperty(resEnt, "sAMAccountName"),
        GUID = resEnt.GetDirectoryEntry().NativeGuid.ToString(),
        DisplayName = GetProperty(resEnt, "displayName"),
        FirstName = GetProperty(resEnt, "givenName"),
        MiddleName = GetProperty(resEnt, "initials"),
        LastName = GetProperty(resEnt, "sn"),
        Company = GetProperty(resEnt, "company"),
        JobTitle = GetProperty(resEnt, "title"),
        Email = GetProperty(resEnt, "mail"),
        Phone = GetProperty(resEnt, "telephoneNumber"),
        ExtensionAttribute1 = GetProperty(resEnt, "extensionAttribute1")
    };
}
3
ответ дан 18 December 2019 в 12:01
поделиться

пространство имен System.DirectoryServices.ActiveDirectory

http://msdn.microsoft.com/en-us/library/system.directoryservices.activedirectory.aspx

2
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: