int除法:为什么1/3的结果==0?

czfnxgou  于 2021-06-29  发布在  Java
关注(0)|答案(16)|浏览(666)

我在写代码:

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

结果为0。为什么会这样,我该如何解决这个问题?

t2a7ltrp

t2a7ltrp1#

java中的转换非常简单,但是需要一些理解。如整数运算的jls中所述:
如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该运算,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先加宽它(§5.1.5)通过数字提升键入long(§5.6).
举例总是翻译jls的最佳方法;)

int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)

否则,该操作将使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其加宽为int类型。

short + int -> int + int -> int

一个使用eclipse的小例子显示,即使加上两个 short s不会那么容易:

short s = 1;
s = s + s; <- Compiling error

//possible loss of precision
//  required: short
//  found:    int

这将需要一个可能失去精度的铸件。
浮点运算符也是如此
如果数值运算符的操作数中至少有一个是double类型,则使用64位浮点运算执行该运算,数值运算符的结果是double类型的值。如果另一个操作数不是double,则首先加宽它(§5.1.5)通过数字提升键入double(§5.6).
所以升职是在浮动上做成双倍的。
整型和浮点值的混合会产生如上所述的浮点值
如果二进制运算符的操作数中至少有一个是浮点类型的,则该操作是浮点操作,即使另一个是整数。
对于二进制运算符,这是正确的,但对于“赋值运算符”,如 += 一个简单的工作示例就足以证明这一点

int i = 1;
i += 1.5f;

原因是这里有一个隐式的cast,它的执行方式是

i = (int) i + 1.5f
i = (int) 2.5f
i = 2
rqdpfwrv

rqdpfwrv2#

将1设为浮点数,将使用浮点数除法

public static void main(String d[]){
    double g=1f/3;
    System.out.printf("%.2f",g);
}
w41d8nur

w41d8nur3#

两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致在除法之后发生隐式转换。
整数除法当然返回向零舍入的除法的真实结果。结果 0.333... 因此在这里四舍五入为0(请注意,处理器实际上没有进行任何舍入,但您仍然可以这样想。)
另外,请注意,如果两个操作数(数字)都以浮点形式给出;3.0和1.0,甚至只是第一个,然后使用浮点运算,给你 0.333... .

gg0vcinb

gg0vcinb4#

因为它将1和3视为整数,因此将结果向下舍入为0,这样它就是一个整数。
要得到您想要的结果,请显式地告诉java数字是双倍的,如下所示:

double g = 1.0/3.0;
vom3gejh

vom3gejh5#

1和3是整数常量,所以java做整数除法,结果是0。如果你想写双常数,你必须写 1.0 以及 3.0 .

x759pob2

x759pob26#

显式地将其转换为 double ```
double g = 1.0/3.0

这是因为java对 `1` 以及 `3` 因为你输入了整数常量。
f3temu5u

f3temu5u7#

试试这个:

public static void main(String[] args) {
    double a = 1.0;
    double b = 3.0;
    double g = a / b;
    System.out.printf(""+ g);
}
ut6juiuv

ut6juiuv8#

因为你在做整数除法。
正如@noldorin所说,如果两个操作符都是整数,那么就使用整数除法。
结果0.33333333不能表示为整数,因此只为结果指定整数部分(0)。
如果任何一个操作符是 double / float ,则将进行浮点运算。但如果你这么做,你也会遇到同样的问题:

int n = 1.0 / 3.0;
up9lanfz

up9lanfz9#

do“双g=1.0/3.0相反。

exdqitrt

exdqitrt10#

1/3 使用整数除法,因为两边都是整数。
你至少需要其中一个 float 或者 double .
如果您在源代码中输入与您的问题类似的值,您可以这样做 1.0/3 ; 这个 1.0 是双人房。
如果你从其他地方得到的值,你可以使用 (double) 扭转局面 int 变成一个 double .

int x = ...;
int y = ...;
double value = ((double) x) / y;
e4eetjau

e4eetjau11#

你应该使用

double g=1.0/3;

double g=1/3.0;

整数除法返回整数。

yx2lnoni

yx2lnoni12#

是我干的。

double g = 1.0/3.0;
System.out.printf("%gf", g);

在进行双重计算时使用.0,否则java会假定您使用的是整数。如果计算使用任意数量的双倍值,则输出将是双倍值。如果都是整数,那么输出将是整数。

k3fezbri

k3fezbri13#

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

因为1和3都是整数,所以结果不是四舍五入的,而是截断的。所以你忽略分数,只取整数。
为了避免这种情况,请至少将数字1或3中的一个设置为十进制形式1.0和/或3.0。

iq3niunx

iq3niunx14#

(1/3)表示整数除法,这就是为什么不能从这个除法中得到小数。要解决此问题,请使用:

public static void main(String[] args) {
        double g = 1.0 / 3;
        System.out.printf("%.2f", g);
    }
lskq00tm

lskq00tm15#

其他许多人没有指出真正的问题:
仅对整数执行的运算将运算结果强制转换为整数。
这必然意味着可以显示为整数的浮点结果将被截断(去掉小数部分)。
你问什么是类型转换?
它在语言的实现上有所不同,但是维基百科有一个相当全面的观点,它也谈到了胁迫,这是回答你问题的关键信息。
http://en.wikipedia.org/wiki/type_conversion

相关问题