Java中特定精度的双精度浮点数

13
我正在编写一个简单的Java程序。我需要从输入中获取一个字符串,并将其分成两个部分:1-double 2-string。然后,我需要在double上进行简单的计算,并将结果以特定精度(4)发送到输出。它运行得很好,但当输入为0时,就无法正常工作。
例如,对于这些输入,输出将是:
1 kg 输出:2.2046
3.1 kg 输出:6.8343
但是当输入为0时,输出应该为0.0000,但它显示为0.0。 我阅读了关于双精度的类似帖子,他们建议使用BigDecimal类,但在这种情况下我不能使用它们。 我用于执行此操作的代码是:
line=input.nextLine();
array=line.split(" ");
value=Double.parseDouble(array[0]);
type=array[1];
value =value*2.2046;
String s = String.format("%.4f", value);
value = Double.parseDouble(s);
System.out.print(value+" kg\n");

尝试使用"%0.4f",这意味着'格式化浮点值,将其用零填充直到有4个数字'。 - user268396
我使用了"%.4f",但出现了以下错误:Exception in thread "main" java.util.MissingFormatWidthException: 0.4f - Mehrdad Salimi
1
请参阅https://dev59.com/Pmgu5IYBdhLWcg3w8bhs,但由于需要格式化为0,因此这不是重复内容。 - Raedwald
6个回答

22

DecimalFormat 可以让你定义要显示多少位数。'0' 将强制输出数字,即使该值为零,而 '#' 将省略零。

System.out.print(new DecimalFormat("#0.0000").format(value)+" kg\n"); 应该就可以了。

请参阅文档

注意:如果经常使用,出于性能原因,您应该只实例化格式化程序一次并存储引用:final DecimalFormat df = new DecimalFormat("#0.0000");。然后使用 df.format(value)


我已经完成了,替换掉你最后一行打印输出值的代码。 - Blacklight
它对我有效,但请将其更改为("#0.0000"),您的答案输出为.0000,但如果我们使用("#0.0000"),它将显示0.0000,感谢您的帮助。 - Mehrdad Salimi

5

在您的方法顶部添加此DecimalFormat实例:

DecimalFormat four = new DecimalFormat("#0.0000"); // will round and display the number to four decimal places. No more, no less.

// the four zeros after the decimal point above specify how many decimal places to be accurate to.
// the zero to the left of the decimal place above makes it so that numbers that start with "0." will display "0.____" vs just ".____" If you don't want the "0.", replace that 0 to the left of the decimal point with "#"

然后,在显示时将实例命名为“four”,并传递您的双精度值:
double value = 0;
System.out.print(four.format(value) + " kg/n"); // displays 0.0000

2
我建议您使用BigDecimal类来进行浮点数计算。这样您就能够控制浮点运算的精度。但是回到主题:

您可以使用以下内容:

static void test(String stringVal) {
    final BigDecimal value = new BigDecimal(stringVal).multiply(new BigDecimal("2.2046"));
    DecimalFormat df = new DecimalFormat();
    df.setMaximumFractionDigits(4);
    df.setMinimumFractionDigits(4);
    System.out.println(df.format(value) + " kg\n");
}

public static void main(String[] args) {
    test("0");
    test("1");
    test("3.1");
}

将会给你以下输出:

0,0000 kg

2,2046 kg

6,8343 kg

谢谢您的信息,我不知道如何使用bigDecimal来设置精度。 - Mehrdad Salimi

2

System.out.format("%.4f kg\n", 0.0d) 打印出 '0.0000 千克'


0

使用 DecimalFormat 将您的双精度值格式化为固定精度字符串输出。

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数。它具有各种功能,旨在使解析和格式化任何语言环境中的数字成为可能,包括支持西方、阿拉伯和印度数字。它还支持不同类型的数字,包括整数(123)、定点数(123.4)、科学计数法(1.23E4)、百分比(12%)和货币金额($123)。所有这些都可以本地化。

示例 -

System.out.print(new DecimalFormat("##.##").format(value)+" kg\n");

你的回答和blacklight的回答就是我想要的,谢谢你的帮助。 - Mehrdad Salimi

0

String.format 只是制作浮点值的字符串表示。 如果它没有提供最小精度的标志,那么只需在字符串结尾填充零。


BlackLight的答案看起来更好。 - Aaron
我使用了你的建议,但它并没有起作用,正如你所说,BlackLight的答案是我想要的。谢谢。 - Mehrdad Salimi
我的答案“不起作用”是不可能的:D 它只是向字符串添加“0”。虽然这是一种次优解决方案,但没有必要重新发明轮子! - Aaron
我认为它不起作用是因为这部分 value=Double.parseDouble(array[0]); - Mehrdad Salimi
@MehrdadSalimi 我的意思是在结果字符串上添加填充 :) 这就是(我猜)Decimalformat将在内部执行的操作。 - Aaron
LOL,抱歉我的英语有问题,:) - Mehrdad Salimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接