好的,我认为这个程序真的很容易。但是,当控制台显示x值(显示在system.out。中)时,我得到“当x为1.20000000000002 ....”时。 我知道1.1 + 0.1不是1.200000000002,所以我只是想知道我的语法有什么问题。如果您决定运行代码以查看,您将立即看到我的问题。 如果有人有任何建议,我将不胜感激!
谢谢
public class EulersMethod {
public static void main(String[] args) {
double x = 1;
double y = 1;
double h = 0.1;
while(x <= 1.4){
System.out.println("When x is " + x + ", y is " + y);
y = y + h * (- x - y);
x = x + h;
}
}
}
答案 0 :(得分:3)
0.1
无法用double
类型精确表示,因此必须进行一些近似/折衷。对于double
,它通常只有大约16到17位有效数字。这就是为什么你无法准确得到1.2
。
答案 1 :(得分:1)
为了扩展我的评论,有些数字可以精确写入双打,如1/2,而其他数字则不能。
0.5 = 1/2
所以可以写成两个权力的总和
0.1 = 1/10 = 1/16 + a bit = 1/16 + 1/32 + a bit more... etc
更多的东西永远不会是两个人的力量,所以你可以得到最接近它的能力。它可能会过冲或下冲。
答案 2 :(得分:1)
这里有一篇很好的文章,说明为什么花车不准确(或者为什么它们永远不应该用于财务计算):http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm
你真正想要的是BigDecimal。
以下是来自JavaWorld的简短教程:http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html
答案 3 :(得分:0)
如果您愿意,可以使用DecimalFormat
进行清理。
DecimalFormat format = new DecimalFormat("0.0");
String decimalValueAsString = format.format(yourDecimalValue);
您还可以使用RoundingMode和方法setRoundingMode
的十进制格式