我有一个作业,我需要从用户那里得到一个输入,以细化对 x(用户的输入)小数位数的答案。我将完善我的答案,直到 x 小数位没有任何变化。你能帮我解决这个问题吗?
3 回答
这里有很多问题,你应该注意。
首先是如果你使用浮点数来表示你的答案,你不能代表所有可能的实数,所以你几乎肯定会得到舍入错误。查看http://floating-point-gui.de/了解更多相关信息。
其次,当你打印一个float
ordouble
值时,Java 会用它做一些魔法,让它看起来很漂亮。请参阅Float.toString(float)
和Double.toString(double)
了解更多信息。
所以实际上,如果你输入
double answer = 3.14159265;
它存储为
3.141592650000000208621031561051495373249053955078125
你可以看到使用
System.out.println(new BigDecimal(answer));
因此,假设您的答案是double
(或float
),您应该使用BigDecimal
'setScale
方法。此外,如果您想将用户可以选择的小数位数限制为打印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);
}
大多数代码是错误/输入检查。真正的工作是由setScale
. 请记住,在处理浮点数时有很多边界条件,你应该很好!
目前尚不清楚您要达到的目标,但我认为您想接受一个数字,然后按照用户指定的方式对其进行四舍五入。
Java 的 BigDecimal http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html类具有您为此目的可能需要的所有功能。请不要使用主要数据类型(float、double),因为它们迟早会导致舍入错误。
虽然@Thihara 的回答是正确的,但也许您需要一种更简单的方法。除非您需要 的精度,否则BigDecimal
您可以这样做:
int x = 4;
double value = 3.141593;
long answer = (long) (value * Math.pow(10, x));
重点是:将值乘以 10^x,然后转换为long
(或int
)。当然,这只适用于小的x
.