我在写代码:
public static void main(String[] args) { double g = 1 / 3; System.out.printf("%.2f", g); }
结果为0。为什么会这样,我该如何解决这个问题?
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
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
rqdpfwrv2#
将1设为浮点数,将使用浮点数除法
public static void main(String d[]){ double g=1f/3; System.out.printf("%.2f",g); }
w41d8nur3#
两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致在除法之后发生隐式转换。整数除法当然返回向零舍入的除法的真实结果。结果 0.333... 因此在这里四舍五入为0(请注意,处理器实际上没有进行任何舍入,但您仍然可以这样想。)另外,请注意,如果两个操作数(数字)都以浮点形式给出;3.0和1.0,甚至只是第一个,然后使用浮点运算,给你 0.333... .
0.333...
gg0vcinb4#
因为它将1和3视为整数,因此将结果向下舍入为0,这样它就是一个整数。要得到您想要的结果,请显式地告诉java数字是双倍的,如下所示:
double g = 1.0/3.0;
vom3gejh5#
1和3是整数常量,所以java做整数除法,结果是0。如果你想写双常数,你必须写 1.0 以及 3.0 .
1.0
3.0
x759pob26#
显式地将其转换为 double ```double g = 1.0/3.0
double
这是因为java对 `1` 以及 `3` 因为你输入了整数常量。
f3temu5u7#
试试这个:
public static void main(String[] args) { double a = 1.0; double b = 3.0; double g = a / b; System.out.printf(""+ g); }
ut6juiuv8#
因为你在做整数除法。正如@noldorin所说,如果两个操作符都是整数,那么就使用整数除法。结果0.33333333不能表示为整数,因此只为结果指定整数部分(0)。如果任何一个操作符是 double / float ,则将进行浮点运算。但如果你这么做,你也会遇到同样的问题:
float
int n = 1.0 / 3.0;
up9lanfz9#
do“双g=1.0/3.0相反。
exdqitrt10#
1/3 使用整数除法,因为两边都是整数。你至少需要其中一个 float 或者 double .如果您在源代码中输入与您的问题类似的值,您可以这样做 1.0/3 ; 这个 1.0 是双人房。如果你从其他地方得到的值,你可以使用 (double) 扭转局面 int 变成一个 double .
1/3
1.0/3
(double)
int
int x = ...; int y = ...; double value = ((double) x) / y;
e4eetjau11#
你应该使用
double g=1.0/3;
或
double g=1/3.0;
整数除法返回整数。
yx2lnoni12#
是我干的。
double g = 1.0/3.0; System.out.printf("%gf", g);
在进行双重计算时使用.0,否则java会假定您使用的是整数。如果计算使用任意数量的双倍值,则输出将是双倍值。如果都是整数,那么输出将是整数。
k3fezbri13#
因为1和3都是整数,所以结果不是四舍五入的,而是截断的。所以你忽略分数,只取整数。为了避免这种情况,请至少将数字1或3中的一个设置为十进制形式1.0和/或3.0。
iq3niunx14#
(1/3)表示整数除法,这就是为什么不能从这个除法中得到小数。要解决此问题,请使用:
public static void main(String[] args) { double g = 1.0 / 3; System.out.printf("%.2f", g); }
lskq00tm15#
其他许多人没有指出真正的问题:仅对整数执行的运算将运算结果强制转换为整数。这必然意味着可以显示为整数的浮点结果将被截断(去掉小数部分)。你问什么是类型转换?它在语言的实现上有所不同,但是维基百科有一个相当全面的观点,它也谈到了胁迫,这是回答你问题的关键信息。http://en.wikipedia.org/wiki/type_conversion
16条答案
按热度按时间t2a7ltrp1#
java中的转换非常简单,但是需要一些理解。如整数运算的jls中所述:
如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该运算,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先加宽它(§5.1.5)通过数字提升键入long(§5.6).
举例总是翻译jls的最佳方法;)
否则,该操作将使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其加宽为int类型。
一个使用eclipse的小例子显示,即使加上两个
short
s不会那么容易:这将需要一个可能失去精度的铸件。
浮点运算符也是如此
如果数值运算符的操作数中至少有一个是double类型,则使用64位浮点运算执行该运算,数值运算符的结果是double类型的值。如果另一个操作数不是double,则首先加宽它(§5.1.5)通过数字提升键入double(§5.6).
所以升职是在浮动上做成双倍的。
整型和浮点值的混合会产生如上所述的浮点值
如果二进制运算符的操作数中至少有一个是浮点类型的,则该操作是浮点操作,即使另一个是整数。
对于二进制运算符,这是正确的,但对于“赋值运算符”,如
+=
一个简单的工作示例就足以证明这一点原因是这里有一个隐式的cast,它的执行方式是
rqdpfwrv2#
将1设为浮点数,将使用浮点数除法
w41d8nur3#
两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致在除法之后发生隐式转换。
整数除法当然返回向零舍入的除法的真实结果。结果
0.333...
因此在这里四舍五入为0(请注意,处理器实际上没有进行任何舍入,但您仍然可以这样想。)另外,请注意,如果两个操作数(数字)都以浮点形式给出;3.0和1.0,甚至只是第一个,然后使用浮点运算,给你
0.333...
.gg0vcinb4#
因为它将1和3视为整数,因此将结果向下舍入为0,这样它就是一个整数。
要得到您想要的结果,请显式地告诉java数字是双倍的,如下所示:
vom3gejh5#
1和3是整数常量,所以java做整数除法,结果是0。如果你想写双常数,你必须写
1.0
以及3.0
.x759pob26#
显式地将其转换为
double
```double g = 1.0/3.0
f3temu5u7#
试试这个:
ut6juiuv8#
因为你在做整数除法。
正如@noldorin所说,如果两个操作符都是整数,那么就使用整数除法。
结果0.33333333不能表示为整数,因此只为结果指定整数部分(0)。
如果任何一个操作符是
double
/float
,则将进行浮点运算。但如果你这么做,你也会遇到同样的问题:up9lanfz9#
do“双g=1.0/3.0相反。
exdqitrt10#
1/3
使用整数除法,因为两边都是整数。你至少需要其中一个
float
或者double
.如果您在源代码中输入与您的问题类似的值,您可以这样做
1.0/3
; 这个1.0
是双人房。如果你从其他地方得到的值,你可以使用
(double)
扭转局面int
变成一个double
.e4eetjau11#
你应该使用
或
整数除法返回整数。
yx2lnoni12#
是我干的。
在进行双重计算时使用.0,否则java会假定您使用的是整数。如果计算使用任意数量的双倍值,则输出将是双倍值。如果都是整数,那么输出将是整数。
k3fezbri13#
因为1和3都是整数,所以结果不是四舍五入的,而是截断的。所以你忽略分数,只取整数。
为了避免这种情况,请至少将数字1或3中的一个设置为十进制形式1.0和/或3.0。
iq3niunx14#
(1/3)表示整数除法,这就是为什么不能从这个除法中得到小数。要解决此问题,请使用:
lskq00tm15#
其他许多人没有指出真正的问题:
仅对整数执行的运算将运算结果强制转换为整数。
这必然意味着可以显示为整数的浮点结果将被截断(去掉小数部分)。
你问什么是类型转换?
它在语言的实现上有所不同,但是维基百科有一个相当全面的观点,它也谈到了胁迫,这是回答你问题的关键信息。
http://en.wikipedia.org/wiki/type_conversion