【问题标题】:Explain "accumulated round-off error" for double values解释双精度值的“累积舍入误差”
【发布时间】:2013-10-21 19:34:25
【问题描述】:

我是一名自学成才的 java 初学者,在同一个等式中使用整数和双精度时难以理解

例如,

int x;
double x;
i = 5;

x = i / 2 + 1.0; // (answer 3.0)

z = (int) 1.0 + i / 2.0; // (answer 3.5)

四舍五入是怎么回事?

【问题讨论】:

  • 除了答案之外,z = (int) 1.0 + i / 2.0 并没有按照你的想法去做。相当于z = ((int) 1.0) + i / 2.0,其中1.0转换为1,然后提升为1.0

标签: java int double


【解决方案1】:

问题在于这个操作:

i / 2

... 正在执行整数除法。这就是为什么5 / 2 给出的结果是2,而不是2.5。这是 Java 中的正常行为,要执行浮点除法,您必须确保至少有一个操作数是浮点文字:

5 / 2.0

现在上面将返回2.5,正如预期的那样。或者,您可以强制转换任一操作数:

((double) i) / 2

【讨论】:

    【解决方案2】:

    涉及两个整数的除法将产生一个整数(因此,5 / 2 = 2)。如果在其中一个操作数中使用双精度,它将产生双精度(因此 5 / 2.0 = 2.5)。其余为操作优先级。

    【讨论】:

      【解决方案3】:

      i / 2 = int 2 因为两个操作数都是整数,所以使用整数除法运算(产生整数结果)

      i / 2.0 = double 2.5 因为 i 首先被强制为双精度(另一个操作数的类型)并使用双除法

      【讨论】:

        【解决方案4】:

        这是整数和小数除法之间的一种情况。

        两个整数相除时,进行整数除法,即数字相除,小数部分截断。

        当所讨论的两个数字中的任何数字是小数(双精度/浮点数)时,每隔一个数字都会被视为小数,因此给定表达式 5 / 2.0。无论 2.0 是什么类型的对象,结果都会返回 2.5(默认为双精度)。

        给定一个混合方程,例如 5 / 2 + 1.0,运算符优先级定义了表达式的计算方式。由于除法的优先级高于加法,因此 5 / 2 被计算为整数除法,返回 2 作为整数。

        然后将其添加到 1.0,其中 2 在评估之前提升为双精度数,将数字 3.0 作为双精度数返回作为最终结果。

        【讨论】:

          猜你喜欢
          • 2018-07-04
          • 1970-01-01
          • 2011-01-08
          • 2020-02-17
          • 2017-09-07
          • 1970-01-01
          • 2018-08-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多