【问题标题】:java : multiplying 2 doubles [duplicate]java:乘以2个双打[重复]
【发布时间】:2016-02-19 14:07:44
【问题描述】:
double multiply() 
{
 double x=(2/3)*3.14*1.02;
 System.out.print(x);

 double y=0.666*3.14*1.02; /*(2/3)=0.666...*/
 System.out.print(y);
}

输出: x=0.0 y=SomeNumber

请解释一下?

【问题讨论】:

  • 你不熟悉这个笑话吗?你有 6 个程序员和 5 块蛋糕。每个程序员能得到多少蛋糕? 0,当然。

标签: java math numbers


【解决方案1】:
(2/3) is 0.

因为两者都是整数。要解决此问题,请使用强制转换或明确说明您的数字不是整数:

double x=(2/3d)*3.14*1.02;

现在你有一个整数除以一个双精度数,结果是双精度数。

更多关于这个的阅读: http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/04/mixed.html

【讨论】:

  • 在这种情况下写 3f 不是一个好主意,因为 2/3f 将被评估为 float,这将花费您的精确度,因为随后会发生对 double 的提升。
  • 很多更好。投赞成票。
【解决方案2】:

(2/3) 首先计算(因为括号),在整数算术中(因为数字文字的类型为int)。小数部分被丢弃。

因此它是一个值为 0 的 int 类型。因此整个表达式为零。

显而易见的补救措施是删除括号并改写 2.0 / 3.0。有些人更喜欢明确的演员表,但我觉得那很难看。

【讨论】:

    【解决方案3】:

    2/3 = 0 因为它们没有显式强制转换为 double,所以它们是整数。整个表达式变为:double x=0*3.14*1.02; 这是0。

    【讨论】:

      【解决方案4】:

      因为 2 和 3 的数据类型都是 int 并且 int/int 为您提供 int,在您的情况下 2/3 为 0。 尝试使用 2.0/3 或 2/3.0 你会得到所需的答案。

      【讨论】:

        【解决方案5】:

        在每个数字后加一个“d”以确保您处理的是双打

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-05
          • 2015-08-21
          • 2016-07-01
          • 1970-01-01
          相关资源
          最近更新 更多