Ваша интуиция верна, вы МОЖЕТЕ потерять точность при преобразовании 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 (т.е. не пытаясь углубиться в реальное представление с плавающей точкой).
В .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();
}
}
Вот пример кода, который я использовал:
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")
};
}
пространство имен System.DirectoryServices.ActiveDirectory
http://msdn.microsoft.com/en-us/library/system.directoryservices.activedirectory.aspx