在java中优化x小数位的答案 9 月 Questions & Answers 178 我有一个作业,我需要从用户那里获得一个输入,以将答案细化到小数点后的x(用户的输入)。我将改进我的答案,直到x小数位没有任何变化。你能帮我找到这个答案吗
# 1 楼答案 虽然@Thihara的答案是正确的,但也许你需要一种更简单的方法。除非需要BigDecimal的精度,否则可以执行以下操作: int x = 4; double value = 3.141593; long answer = (long) (value * Math.pow(10, x)); 重点是:将该值乘以10^x,然后转换为long(或int)。当然,这只适用于较小的x
# 2 楼答案 这里有很多问题,你应该意识到 首先,如果你用一个浮点数来表示你的答案,你不能代表所有可能的实数,所以你几乎肯定会得到舍入误差。查看http://floating-point-gui.de/了解有关这方面的详细信息 其次,当您打印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); } 大多数代码都是错误/输入检查。真正的工作是由setScale完成的。请记住,在处理浮点数时有很多边界条件,你应该做得很好
# 3 楼答案 现在还不清楚你想要达到什么目的,但我认为你想要接受一个数字,然后根据用户的指定进行取整 Java的BigDecimal http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html类具有实现此目的所需的所有函数。请不要使用主要数据类型(float、double),因为它们迟早会导致舍入错误
# 1 楼答案
虽然@Thihara的答案是正确的,但也许你需要一种更简单的方法。除非需要
BigDecimal
的精度,否则可以执行以下操作:重点是:将该值乘以10^x,然后转换为
long
(或int
)。当然,这只适用于较小的x
# 2 楼答案
这里有很多问题,你应该意识到
首先,如果你用一个浮点数来表示你的答案,你不能代表所有可能的实数,所以你几乎肯定会得到舍入误差。查看http://floating-point-gui.de/了解有关这方面的详细信息
其次,当您打印} 和^{}
float
或double
值时,Java会对其进行一些处理,使其看起来很漂亮。详见^{所以在现实中,如果你进入
它存储为
你可以用
所以假设你的答案是} 方法。此外,如果希望将用户可以选择的小数位数限制为以字符串形式打印
double
(或float
),你应该使用BigDecimal
的^{double
时可见的数字,请将String.valueOf(answer)
传递给BigDecimal
的构造函数下面是一个小程序,演示如何做到这一点
大多数代码都是错误/输入检查。真正的工作是由
setScale
完成的。请记住,在处理浮点数时有很多边界条件,你应该做得很好# 3 楼答案
现在还不清楚你想要达到什么目的,但我认为你想要接受一个数字,然后根据用户的指定进行取整
Java的BigDecimal http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html类具有实现此目的所需的所有函数。请不要使用主要数据类型(float、double),因为它们迟早会导致舍入错误