相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

浮点不准确的例子

你如何向仍然认为计算机是无限智能和准确的新鲜程序员和外行人解释浮点不准确?
你有一个最喜欢的例子或轶事似乎比一个精确但干燥的解释更好地理解这个想法吗?
这是如何在计算机科学课程中教授的?

floating-point floating-accuracy

29
推荐指数
3
解决办法
10万
查看次数

使用双精度时,为什么不(x /(y*z))与(x/y/z)相同?

这部分是学术性的,就我的目的而言,我只需将它四舍五入到小数点后两位; 但是我很想知道结果会产生两个稍微不同的结果.

这是我写的测试,以缩小到最简单的实现:

@Test
public void shouldEqual() {
  double expected = 450.00d / (7d * 60);  // 1.0714285714285714
  double actual = 450.00d / 7d / 60;      // 1.0714285714285716

  assertThat(actual).isEqualTo(expected);
}
Run Code Online (Sandbox Code Playgroud)

但它失败了这个输出:

org.junit.ComparisonFailure: 
Expected :1.0714285714285714
Actual   :1.0714285714285716
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细解释引擎盖下发生的事情导致1.000000000000000的价值X不同吗?

我在答案中寻找的一些要点是:精度丢失在哪里?首选哪种方法,为什么?哪个是正确的?(在纯数学中,两者都不对.也许两者都错了?)这些算术运算有更好的解决方案或方法吗?

java double rounding operator-precedence double-precision

22
推荐指数
2
解决办法
1705
查看次数

不可预知的双倍

可能重复:
.NET上的双精度问题
Double计算产生奇数结果

我知道双重价值的内部代表0.2是类似的0.199999.但是下面的代码仍然让我感到困惑.

码:

public static void main(String[] args) {
    double d= 0.3d;
    double f= 0.1d;
    System.out.println(d+f);
    System.out.println(d*f);
    System.out.println(d);
    System.out.println(f);
    System.out.println(d-f);
    System.out.println(d/f);
    System.out.println((d-f)*(d-f));
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

0.4
0.03
0.3
0.1
0.19999999999999998
2.9999999999999996
0.039999999999999994
Run Code Online (Sandbox Code Playgroud)

实际上发生了什么?加法,乘法顺利,但减法,除法不是.任何人都可以详细说明为什么加法与减法不同

java math double operation

1
推荐指数
1
解决办法
1462
查看次数

在Java中使用双算术得到错误的答案

可能重复:
双重计算产生奇数结果

我正在用Java编写一个处理大量双算术的程序.我最终到了需要添加0.6666666666666666和-0.666666666666667的地步.但是,我得到的答案是-3.3306690738754696E-16.

换一种说法,

double d1 = 0.6666666666666666;
double d2 = -0.666666666666667;
System.out.println(d1 + d2);
Run Code Online (Sandbox Code Playgroud)

打印出"-3.3306690738754696E-16".为什么会这样?

先感谢您.

java math floating-point double

1
推荐指数
1
解决办法
3931
查看次数