Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以可读格式显示BigDecimal值?_Java - Fatal编程技术网

Java 如何以可读格式显示BigDecimal值?

Java 如何以可读格式显示BigDecimal值?,java,Java,假设我们有一个BigDecimal变量设置如下,并且我们不能更改它的创建方式: BigDecimal num = new BigDecimal(6.0053); 因此,我们将在输出后看到以下“pretty”值: System.out.println(num); //0053000000000000824229573481716215610504150390625 我发现解决此问题的唯一方法是使用BigDecimal.valueOf() 但有没有更简单的解决办法 提前感谢。使用java.t

假设我们有一个BigDecimal变量设置如下,并且我们不能更改它的创建方式:

BigDecimal num = new BigDecimal(6.0053);
因此,我们将在输出后看到以下“pretty”值:

System.out.println(num);   //0053000000000000824229573481716215610504150390625
我发现解决此问题的唯一方法是使用BigDecimal.valueOf()

但有没有更简单的解决办法


提前感谢。

使用
java.text.DecimalFormat
设置数字格式

NumberFormat format = new DecimalFormat("0.####");
System.out.println(format.format(num));

可以找到格式选项

使用
java.text.DecimalFormat
设置数字格式

NumberFormat format = new DecimalFormat("0.####");
System.out.println(format.format(num));

可以找到格式选项

您可以将
String.format
与“
g
”格式类型一起使用。它允许您控制所需的位数等。有关所有格式选项,请参阅

BigDecimal num = new BigDecimal(6.0053);
String formated = String.format("%6.5g", num);
System.out.println(formated);

(结果:
6.0053

您可以将
String.format
与“
g
”格式类型一起使用。它允许您控制所需的位数等。有关所有格式选项,请参阅

BigDecimal num = new BigDecimal(6.0053);
String formated = String.format("%6.5g", num);
System.out.println(formated);

(结果:
6.0053

我打赌它不会比BigDecimal.valueOf(num.doubleValue())简单。我想知道有什么非常简单的解决方案吗?@XpressOneUp确实没有,这张海报没有提出其他要求,但它也会提供特定的小数位数,避免使用科学符号,以及其他各种可能需要但可能还不知道的东西。您的选择。我打赌它不会比BigDecimal.valueOf(num.doubleValue())更简单。我想知道有什么非常简单的解决方案吗?@XpressOneUp确实没有,这张海报没有提出其他要求,但它也会提供特定的小数位数,避免使用科学符号,以及其他各种可能需要但可能还不知道的东西。您的选择。不要使用
新的BigDecimal(double)
构造函数-它会创建不精确的值:潜在的问题在于值,它不能表示您希望它表示的内容。你说你不能改变它的创建方式,但你应该真正关注它,因为问题就是从这里开始的。其他任何东西都只是在裂缝上盖上一层纸。@Natix:不,它创建了完全精确的值——只是不是您可能期望的值。我不同意这里关于“不可预测性”的文档-结果是可预测的,但你需要先了解发生了什么。谢谢Jon,我知道问题在于创建,我只对一些快速而肮脏的解决方法感兴趣。不要使用新的BigDecimal(double)constructor—它创建了不精确的值:潜在的问题在于值,它不能表示您希望它表示的内容。你说你不能改变它的创建方式,但你应该真正关注它,因为问题就是从这里开始的。其他任何东西都只是在裂缝上盖上一层纸。@Natix:不,它创建了完全精确的值——只是不是您可能期望的值。我不同意这里关于“不可预测性”的文档-结果是可预测的,但你需要首先了解发生了什么。谢谢Jon,我知道问题在于创造,我只对一些快速而肮脏的解决方法感兴趣。大小数是数字,因此可以传递给小数格式,无需将其转换为双精度优先(精度损失和更小的数字范围)。没错,我不知道。。。将编辑我的答案BigDecimals是数字,因此可以传递到DecimalFormat,无需先将它们转换为double(精度损失和更小的数字范围)。没错,我不知道。。。将编辑我的答案
BigDecimal num = new BigDecimal(6.0053);
String formated = String.format("%6.5g", num);
System.out.println(formated);