String.format(%X,num)仅适用于整数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String.format(%X,num)仅适用于整数吗?相关的知识,希望对你有一定的参考价值。

我正在尝试将十进制数转换为六。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double num_in = sc.nextDouble();
        System.out.print(String.format("%X", num_in));
    }

运行此命令后,我在下面收到错误消息。

Exception in thread "main" java.util.IllegalFormatConversionException: x != java.lang.Double

当我输入整数而不是双精度时,代码起作用。

我已经尝试过%X%f,%X,%f,它们也有错误。我发现其他人在String.format()中使用双数。我在String.format()中找不到arg的任何格式限制。 String.format()无法将十进制双精度数转换为六进制吗?

答案

您想要的不清楚。您不能真正“以十六进制打印双精度”。

陈述示例输入和所需的输出种类。

示例1

输入:12.11所需的输出:C.B

示例答案

这毫无意义。想象一下,输入为12.10,那么您想要的输出为C.A,除了12.1012.1相同,因此C.A没有意义。

示例2

输入:12.11所需的输出:C.(something that makes sense here)

这里涉及一些棘手的数学。 .11是'1 1 / 10th + 1 1 / 100th'。十六进制的等效值为'? 1 / 16th +? 1 / 256th +? 1 / 4096th,依此类推。将.11转换为无限扩展,将1除以3​​的方式永无止境(永远为0.33333333)。您会发现10在16中不能被整除。

示例3

输入:12.11所需的输出:C.11

答案

那..很奇怪,但是如果你想要那,好的。显然,鉴于它是任意的和荒谬的,因此没有一个格式字母可以做到这一点。分离出整数部分和小数部分,然后分别打印(每个字母都有自己的字母)。类似于:

long integral = (long) numIn;
double fractional = numIn - integral; // for large numbers this fails, take care.
String fracString = String.format("%.4f", fractional).substring(1); // lop off the 0.
return String.format("%X", integral) + fracString;

注意:通常十六进制分数不是问题。

示例4

我想在内存中使用该双精度值的位表示(根据IEEE754 spec)。

答案

System.out.printf("%X", Double.doubleToLongBits(numIn));

请注意,这看起来与十进制数字完全不同,请参阅Wikipedia页面,该页面说明了这些内容的存储方式(这很复杂)。

以上是关于String.format(%X,num)仅适用于整数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 String.format() 和十六进制数字

C# String.Format 等价于带有自定义格式化程序的 JS

swift - 仅适用于架构 x86_64 模拟器的重复符号

iPhone SDK 4 仅适用于 Mac OS X Snow Leopard?

OCA U详细订单管理电子邮件通知(1.5.2)vQmod-仅适用于1.5.6.4 OpenCart v1.5.x-

OCA U详细订单管理电子邮件通知(1.5.2)vQmod-仅适用于1.5.6.4 OpenCart v1.5.x