我想创建一个Java源代码,功能类似于Oracle的TO_NUMBER



例如…应用十六进制"DE82C38142C69491"到Oracle TO_NUMBER结果如下:

select TO_NUMBER('DE82C38142C69491', 'XXXXXXXXXXXXXXXX') from dual
/* 
result : 
16033592583330894993 
*/

我在Java中尝试了这个,代码如下:

Long.parseUnsignedLong("DE82C38142C69491", 16);
/*
result : 
-2413151490378656623
*/

我理解错了。有一种方法来使用Oracle的TO_NUMBER在Java?

十六进制数DE82C38142C69491为-2413151490378656623。

Java的长整数是有符号的,D设置了顶位,所以DE82C38142C69491表示一个负数。

运行System.out.println(Long.toHexString(-2413151490378656623L));,你会看到你得到了DE82C38142C69491

这样就得到了原始十六进制数的所有位。

你可以使用new BigInteger("DE82C38142C69491", 16);,它会给你一个包含16033592583330894993的BigInteger,但是-2413151490378656623已经包含了你所有的位。

Java的long是一个有符号的64位整数类型,支持范围从-263到263-1。

然而,在Java 8中,为无符号处理类型long添加了一些方法,例如Long.compareUnsigned(long x, long y)。虽然旧的方法将继续将long值视为有符号的,但这些新方法的范围为0到264-1。文档说明:

在Java SE 8及以后的版本中,您可以使用long数据类型来表示无符号64位长,最小值为0,最大值为0264-1.

这只是一种不同的解释。

System.out.println(Long.parseUnsignedLong("DE82C38142C69491", 16));

…它实际上调用了Long.toString(),将输出:

-2413151490378656623

但是如果你……

System.out.println(Long.toUnsignedString(Long.parseUnsignedLong("DE82C38142C69491", 16)));

…您将得到:

16033592583330894993

这是因为16033592583330894993大于263-1,但也小于264-1。

不过,如果你处理的是这么大的数字,你可能最好使用BigInteger

相关内容

最新更新