Tag: long integer

Java Collections.shuffle()奇怪的行为

我正在经历一些奇怪的事情。 我有一个很大的长数列表。 它按升序包含大约20万个数字。 这些数字总是截然不同的; 它们不一定是连续的,但它们中的一些通常是连续的。 我想从这个列表中提取一个5k的已排序样本,所以基本上这是我的方法: 我调用java.util.Collections.shuffle(list); 我从现在洗牌的list提取出前5k个元素 我按升序对提取的元素进行排序 不过,我的结果有些奇怪。 如果不是连续的话,我提取的很多随机长片看起来很可疑。 例如,我得到了: … 38414931, 38414932, 38414935, 38414937, 38414938, 38414939, 38414941, … 这绝对不是随机的:/ 有一个更奇怪的事情。 在调试时,我尝试将初始list和提取的样本写入文件以进行比较。 如果我这样做,我的问题似乎消失了,我提取的Longs看起来像是正确的随机数。 当然,我已经重复了很多次,每次我都经历过这两种行为。 我错过了什么吗? 编辑:这是我正在使用的代码: List allNumbers = ; —>如果在这里我将allNumbers写入文件,它似乎工作正常 Collections.shuffle(allNumbers); HashSet randomNumbers = new HashSet(); for (int i = 0; i < 5000; i++) { randomNumbers.add(allNumbers.get(i)); }

将’int’转换为’long’或使用’long’访问太长的数组

假设我有一个足够长的数组,可以用int访问它的任何索引,有没有办法用int来访问这样一个数组的索引? 以及Java如何处理这种数组? 例: int[] a = new int[]{1,5,2,4……..9,2,1} 假设在上面的数组中, 9,2,1处于超出int (2 31 )范围的索引处。 我如何访问这些元素?

从双精度中删除.0

我试图动态地在字符串中显示数字,所以如果数字有十进制显示它们但是如果不显示.0 示例:将5.5显示为5.5,将5.0显示为5 这就是我到目前为止:(答案是双倍的) double temp = answer; long temp2 = (long) temp; if (temp == temp2) { output = String.valueOf(temp2); System.out.println(output); 由于Long的最大尺寸,这项工作的罚款大约为1e18然后会出错。 那么我如何在5.43e86等更大的数字上实现这一目标

Java:将(long)Object转换为double的许多方法

我有一个Object obj ,我知道它实际上很long 。 在某些Math代码中,我需要它为double 。 直接将其加倍可以安全吗? double x = (double)obj; 或者我应该先把它再做一次然后再加倍。 double x = (double)(long)obj; 我还发现了另一个(不太可读)替代方案: double x = new Long((long)obj).doubleValue(); 这样做有什么危险/含义? 解决方案总结 obj是一个Number而不是long 。 Java 6需要显式转换,例如: double x = ((Number)obj).doubleValue() Java 7具有工作魔法: double x = (long)obj 有关Java6 / 7问题的更多详细信息,请阅读有关TJ答案的讨论。 编辑:我做了一些快速测试。 两种投射方式(显式/魔术)具有相同的性能。

再次访问IEEE-754双(64位浮点)与长(64位整数)

我正在重新审视一个问题( 如何测试数字转换是否会改变值? ),就我所关注的问题而言,我已经完全解决了。 问题是检测特定数值何时会溢出JavaScript的IEEE-754数字类型。 之前的问题是使用C#,标记的答案完美无缺。 现在我正在执行完全相同的任务,但这次是在Java中,它不起作用。 AFAIK,Java使用IEEE-754作为其双数据类型。 所以我应该能够来回摆动它以强制失去精确度,但它往返。 对此感到困惑,我开始深入研究Java,现在我真的很困惑。 在C#和Java中,long的最小值和最大值都是相同的: long MIN_VALUE = -9223372036854775808L; long MAX_VALUE = 9223372036854775807L; AFAIK,这些值超出了IEEE-754中可表示的数字,因为为指数和符号保留了固定位。 // this fails in browsers that have stuck with the pure ECMAScript Number format var str = Number(-9223372036854775808).toFixed(); if (“-9223372036854775808” !== str) { throw new Error(“Overflow!”); } 这在Java中返回false (值= -9223372036854775808L): boolean invalidIEEE754(long value) { try { […]

Java – 将解析和无符号hex字符串转换为带符号的long

我有一堆hex字符串,其中之一,例如: d1bc4f7154ac9edb 这是hex值“-3333702275990511909”。 如果你做Long.toHexString(“d1bc4f7154ac9edb”),你就得到了相同的hex数; 现在,让我们假设我只能访问hex字符串值,就是这样。 这样做: Long.parseLong(hexstring, 16); 不起作用,因为它将它转换为对Long而言太大的不同值。 是否可以将这些无符号hex值转换为有符号长整数? 谢谢!

输入大数字以避免NumberFormatException

我必须控制从1到9999999999的输入(表示学校的注册号)原始类型long只能容纳大约2.000.000.000,我该如何存储这个大小的数字?

Java 8:为什么我不能将这个二进制字符串解析为long?

长话短说,我在Java中搞乱了一些基本的遗传算法。 我用了long来存储我的基因,但我在调试时使用二进制字符串来提高可读性。 我遇到了一个奇怪的情况,我无法解析一些以1开头的二进制字符串(我不知道是否总是这样,但它似乎与长度为64个字符的字符串一致)。 我能够通过以下示例复制此内容: String binaryString = Long.toBinaryString(Long.MIN_VALUE); long smallestLongPossibleInJava = Long.parseLong(binaryString, 2); 将抛出并生成以下堆栈跟踪: Exception in thread “main” java.lang.NumberFormatException: For input string: “1000000000000000000000000000000000000000000000000000000000000000” at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:592) at com.company.Main.main(Main.java:25) 鉴于我有一个正确格式化的六十四个字符的二进制字符串,为什么我不能解析一些字符串? 大多数情况下,我的字符串是随机生成的,但在上面的实例中,这应该可以工作(看作Long.MIN_VALUE肯定是Java中的有效长Long.MIN_VALUE )。

按位XOR java长

我在Ubuntu 12.04上使用Oracle Java 7.51,并试图这样做 long a = 0x0000000080000001 ^ 0x4065DE839A6F89EEL; System.out.println(“result “+ Long.toHexString(a)); Output: result bf9a217c1a6f89ef 但是我期待结果是4065de831a6f89ef ,因为^运算符在Java中是一个按位XOR。 我读错了Java规范的哪一部分?

在Java中没有转换的两到长

我需要将double转换为long保留其二进制结构,而不是数值。 只需更改类型,但保留二进制值。 有原生方式吗?