Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double
. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1
, который является 1/10
), знаменатель которого не является степенью двух, не могут быть точно представлены.
Для 0.1
в стандартном формате binary64
представление может записывается в точности как
0.1000000000000000055511151231257827021181583404541015625
в десятичной форме или 0x1.999999999999ap-4
в нотации C99 hexfloat . Напротив, рациональное число 0.1
, которое является 1/10
, может быть записано точно как
0.1
в десятичной форме или 0x1.99999999999999...p-4
в аналоге обозначения гексафлоата C99, где ...
представляет собой бесконечную последовательность 9. Константы 0.2
и 0.3
в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double
до 0.2
больше, чем рациональное число 0.2
, но ближайший double
до 0.3
меньше, чем рациональное число 0.3
. Сумма 0.1
и 0.2
заканчивается выше, чем рациональное число 0.3
и, следовательно, не согласуется с константой в вашем коде.
Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .
Я нашел способ получить имя клиентской машины.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
Logger.getLogger(this.getClass()).warning("Inside Confirm Servlet");
response.setContentType("text/html");
String hostname = request.getRemoteHost(); // hostname
System.out.println("hostname"+hostname);
String computerName = null;
String remoteAddress = request.getRemoteAddr();
System.out.println("remoteAddress: " + remoteAddress);
try {
InetAddress inetAddress = InetAddress.getByName(remoteAddress);
System.out.println("inetAddress: " + inetAddress);
computerName = inetAddress.getHostName();
System.out.println("computerName: " + computerName);
if (computerName.equalsIgnoreCase("localhost")) {
computerName = java.net.InetAddress.getLocalHost().getCanonicalHostName();
}
} catch (UnknownHostException e) {
}
System.out.println("computerName: " + computerName);
}
Возможно ли получить имя клиентской машины?
blockquote>Возможно, вы, вероятно, ссылаетесь на имя NetBIOS. Если это так, вы должны использовать некоторую библиотеку, которая реализует NetBIOS / SMB / CIFS в java для этого.
, если возможно, как
blockquote>Посмотрите на JCIFS . Я не дам вам точный фрагмент кода, но это направление, в котором вы должны двигаться, чтобы решить эту проблему.
Или есть ли другой способ получить данные этого пользователя
blockquote >Насколько я понимаю вашу проблему, вам нужен способ определить хост, и вы не можете полагаться на IP-адрес для этого.
Если это так, то один из других вариантов будет использовать MAC-адрес, но вы, вероятно, не сможете это сделать с чистой java, поскольку это более низкоуровневый протокол, с которым обычно работает Java, поэтому он, вероятно, будет менее переносимым. Этот учебник может помочь.
UPDATE
Я сталкиваюсь с стеком NetBIOS / SMB / CIFS, но я не работал с ним в Java и JCIFS . Вот почему я не буду давать вам конкретную часть кода, которая решит вашу проблему, а скорее направление, в котором вы должны смотреть.
Отметьте NbtAddress класс docs. Кажется, это то, что вы ищете. Также ознакомьтесь с примерами , чтобы получить представление о том, как его можно использовать.