在java中优化x小数位的答案

在java中优化x小数位的答案,java,Java,我有一个作业,我需要从用户那里得到一个输入,以将答案精确到小数点后的x(用户的输入)。我将改进我的答案,直到小数点后x位没有任何变化。你能帮助我如何得到这个答案吗 不太清楚您想要实现什么,但我认为您希望接受一个数字,然后根据用户的指定将其四舍五入 Java的BigDecimal类具有实现此目的所需的所有函数。请不要使用主要数据类型(float、double),因为它们迟早会导致舍入错误。虽然@Thihara回答的是事实,但也许您需要一种更简单的方法。除非需要BigDecimal的精度,否则可以执

我有一个作业,我需要从用户那里得到一个输入,以将答案精确到小数点后的x(用户的输入)。我将改进我的答案,直到小数点后x位没有任何变化。你能帮助我如何得到这个答案吗

不太清楚您想要实现什么,但我认为您希望接受一个数字,然后根据用户的指定将其四舍五入


Java的BigDecimal类具有实现此目的所需的所有函数。请不要使用主要数据类型(float、double),因为它们迟早会导致舍入错误。

虽然@Thihara回答的是事实,但也许您需要一种更简单的方法。除非需要
BigDecimal
的精度,否则可以执行以下操作:

intx=4;
双值=3.141593;
长答案=(长)(值*数学功率(10,x));

要点是:将该值乘以10^x,然后转换为
long
(或
int
)。当然,这只适用于较小的
x

这里有很多问题,您应该注意

首先,如果你用一个浮点数来表示你的答案,你不能代表所有可能的实数,所以你几乎肯定会得到舍入误差。请查看有关此的详细信息

其次,当您打印一个
float
double
值时,Java对其进行了一些处理,使其看起来很漂亮。有关更多信息,请参阅和

所以在现实中,如果你进入

double answer = 3.14159265;
它存储为

3.141592650000000208621031561051495373249053955078125
您可以使用

System.out.println(new BigDecimal(answer));
因此,假设您得到的答案是
double
(或
float
),您应该使用
BigDecimal
的方法。另外,如果要将用户可以选择的小数位数限制为以字符串形式打印
double
时可见的数字,请将
string.valueOf(answer)
传递给
BigDecimal
的构造函数

这里有一个小程序,演示如何做到这一点

public static void main(String[] args) {
    double answer = 3.14159265;

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String input = null;
    do {
        System.out.println("Answer: " + answer);
        System.out.println("How many decimal places do you want? ");
        try {
            input = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (input != null) {
            try {
                int decimalPlaces = Integer.parseInt(input);
                if (decimalPlaces < 0) {
                    System.out.println("Enter a positive value.");
                } else {
                    BigDecimal scaled = new BigDecimal(
                            String.valueOf(answer));
                    if (decimalPlaces > scaled.scale()) {
                        System.out
                                .println("Answer does not have that many decimal places.");
                    } else {
                        scaled = scaled.setScale(decimalPlaces,
                                RoundingMode.HALF_EVEN);
                        System.out.println("Rounded answer: " + scaled);
                    }
                }
            } catch (Exception e) {
                System.out.println("Not a valid number.");
            }
        }
    } while (input != null);
}
publicstaticvoidmain(字符串[]args){
双答案=3.14159265;
BufferedReader in=新的BufferedReader(新的InputStreamReader(System.in));
字符串输入=null;
做{
System.out.println(“回答:+Answer”);
System.out.println(“您需要小数点后多少位?”);
试一试{
input=in.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
如果(输入!=null){
试一试{
int decimalPlaces=Integer.parseInt(输入);
如果(小数位数<0){
System.out.println(“输入正值”);
}否则{
BigDecimal scaled=新的BigDecimal(
字符串.valueOf(答案));
如果(小数点>缩放.scale()){
系统输出
.println(“答案没有那么多小数位。”);
}否则{
缩放=缩放。设置缩放(小数位数,
圆形模式。半偶数);
System.out.println(“四舍五入回答:+缩放);
}
}
}捕获(例外e){
System.out.println(“不是有效数字”);
}
}
}while(输入!=null);
}

大多数代码都是错误/输入检查。真正的工作是通过
setScale
完成的。请记住,在处理浮点数时,有许多边界条件,您应该做得很好

虽然您的答案(当然)是正确的、有用的,而且对于Java程序员来说,了解它也很重要,但我认为对于刚开始编程的人来说,这有点“太多”。由于提问者“对Java非常陌生”,而且这是一项作业,我认为如果你能在回答的开头添加一些“基本”信息,而不是从“奇怪的”浮点问题开始,这会有所帮助…@siegi我同意你的看法,我可能会完全不符合我的要求,发布这个答案,但我这样做的原因如下:1)无论是在这个问题上,还是在我看到的其他答案中,没有一个能让我满意。2) 我很好奇正确地做这件事有多困难(如果你简单地乘以
10^x
,转换成int,除以
10^x
,你会遇到各种各样的问题)。3) 我认为了解浮点数比学习如何将答案四舍五入到某个小数位数更有价值。另外,这不是一个“奇怪的”浮点问题,它是非常标准的。很好的理由!:-)“怪异”的意思是,对于初学者来说,它可能看起来很怪异。我知道这是完全正常的,这就是为什么我把它放在引号里;-)