我正在使用DecimalFormat将双精度格式化为String。 然后将此String集成到我的表示层中。
格式: #。## - >这使用所有数字之前小数,但 ROUNDS 数字 AFTER 小数。
我可以使用#。######### 作为大十进制数,但如果小数点甚至更长怎么办?
我发现我的小测试程序很有用,并希望与您分享。
你能帮我显示所有小数吗?
package be.softwarelab.numbers;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class DecimalNumbersTest {
private static final double NUMBER = 123456789.123456789;
public static void main(String[] args) {
String format01 = "#.";
String format02 = "#.#";
String format03 = "#.##";
String format04 = "#.###";
String format05 = "#.####";
System.out.println("====== NUMBER ===== USA =====================================");
showResult(NUMBER, format01, Locale.US);
showResult(NUMBER, format02, Locale.US);
showResult(NUMBER, format03, Locale.US);
showResult(NUMBER, format04, Locale.US);
showResult(NUMBER, format05, Locale.US);
System.out.println("====== NUMBER ===== France ==================================");
showResult(NUMBER, format01, Locale.FRANCE);
showResult(NUMBER, format02, Locale.FRANCE);
showResult(NUMBER, format03, Locale.FRANCE);
showResult(NUMBER, format04, Locale.FRANCE);
showResult(NUMBER, format05, Locale.FRANCE);
System.out.println("=============================================================");
}
public static void showResult(double number, String format, Locale locale) {
// Using a Locale to see the differences between regions.
DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(locale);
DecimalFormat formatter = new DecimalFormat (format, otherSymbols);
// Create the String result
String output = formatter.format(number);
// Format the output for a nice presentation.
System.out.format(" %s %11s = %20s\n", locale, format, output);
}
}
这导致:
====== NUMBER ===== USA =====================================
en_US #. = 123456789.
en_US #.# = 123456789.1
en_US #.## = 123456789.12
en_US #.### = 123456789.123
en_US #.#### = 123456789.1235
====== NUMBER ===== France ==================================
fr_FR #. = 123456789,
fr_FR #.# = 123456789,1
fr_FR #.## = 123456789,12
fr_FR #.### = 123456789,123
fr_FR #.#### = 123456789,1235
=============================================================
修改:一位用户提到了相关问题:How to nicely format floating numbers to String without unnecessary decimal 0? 这个问题并没有解决我的问题,因为它侧重于限制尺寸,但我需要尽可能长时间地保留它。
答案 0 :(得分:1)
String.format可能会帮助您 - NumberFormat
private static void printfWithLocale(Locale locale, Double d){
System.out.println("Output locale: " + locale.toString());
String simpleOutputTeplate = "simpleOutputTeplate: %s";
String refinedOutputTeplate = "refinedOutputTeplate: %.10f";
System.out.println(String.format(locale, simpleOutputTeplate, d));
System.out.println(String.format(locale, refinedOutputTeplate, d));
}
public static void main(String[] args) {
Double d = new Double(3.1234567890123456789);
printfWithLocale(Locale.US, d);
System.out.println("");
printfWithLocale(Locale.FRANCE, d);
}
代码输出:
Output locale: en_US
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3.1234567890
Output locale: fr_FR
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3,1234567890
您会注意到%s(字符串)不符合Locale,但会将Double格式化为最多17个小数点。 使用String.format,您可以进一步细化数字在字符串中的格式化方式。
答案 1 :(得分:-1)
由于double并不完全代表某些数字,因此切换到给定的小数长度(如17)并不重要。有关解释How many significant digits have floats and doubles in java?
,请参阅此其他问题