Учитывая пример кода:
String format = "{0,number}"; // <- What do I put here?
double value = Math.PI * 1e-10;
System.out.println(value);
System.out.println(new MessageFormat(format, Locale.US).format(new Object[]{value}));
System.out.println(new MessageFormat(format, Locale.FRANCE).format(new Object[]{value}));
Что я использую в качестве строки формата, чтобы я получал вывод с полной точностью любого двойного значения и чтобы вывод был локализован?Например, вывод текущего кода:
3.1415926535897934E-10
0
0
String.valueOf(double)
правильно печатает с полной точностью, но это не формат сообщения и он не локализован.Формат сообщения решает, что значение слишком мало, чтобы беспокоиться.Для больших чисел результаты еще хуже!MessageFormat
печатает 16 значащих цифр, а затем добавляет группу нулей, которые не точно отражают значение, хранящееся в двойном числе.Например, с pi * 1e100
я получаю:
3.141592653589793E100
31,415,926,535,897,930,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
31 415 926 535 897 930 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000