java中的精度损失

java中的精度损失,java,type-conversion,Java,Type Conversion,在java中,所有整数文本都被视为int,而浮点文本在java中被视为double。 那为什么呢 byte b =10; 没有给出任何错误,但是 float f = 10.0; 在这两种情况下进行向下转换时都会出现精度损失错误?在int到byte的情况下,不必担心精度损失,因为这两种类型的粒度相同。如果试图将值超出byte范围的文本转换为byte,则会出现错误。(这种情况下给出的错误消息有点误导。) 在double到float的情况下,可以有一个在正确范围内的常量值,但仍然会失

在java中,所有整数文本都被视为int,而浮点文本在java中被视为double。 那为什么呢

    byte b =10;
没有给出任何错误,但是

   float f = 10.0;

在这两种情况下进行向下转换时都会出现精度损失错误?

int
byte
的情况下,不必担心精度损失,因为这两种类型的粒度相同。如果试图将值超出
byte
范围的文本转换为
byte
,则会出现错误。(这种情况下给出的错误消息有点误导。)

double
float
的情况下,可以有一个在正确范围内的常量值,但仍然会失去精度。在10.0的特定情况下,该值可以用
float
double
精确表示,但一般情况下并非如此

作为一个例子,考虑一下:

float f = (float) 10.1; // Or float f = 10.1f;
double d = 10.1;
System.out.println(f == d); // Prints false

这是因为在从
double
float
的转换过程中,精度正在丢失-这两种类型都不能精确表示10.1,但是
double
float
更接近它。
=
运算符将意味着
f
被转换回
双精度
,与
d
具有不同的值在
int
byte
的情况下,没有真正的精度损失问题,因为这两种类型的粒度相同。如果试图将值超出
byte
范围的文本转换为
byte
,则会出现错误。(这种情况下给出的错误消息有点误导。)

double
float
的情况下,可以有一个在正确范围内的常量值,但仍然会失去精度。在10.0的特定情况下,该值可以用
float
double
精确表示,但一般情况下并非如此

作为一个例子,考虑一下:

float f = (float) 10.1; // Or float f = 10.1f;
double d = 10.1;
System.out.println(f == d); // Prints false

这是因为在从
double
float
的转换过程中,精度正在丢失-这两种类型都不能精确表示10.1,但是
double
float
更接近它。
=
运算符意味着将
f
转换回
双精度
,与
d

的值不同。这是因为为浮点数定义了标准。阅读更多可能重复的注释,使用
f
后缀,您将获得
float
literal而不是
double
literal。。。使用
L
后缀,可以得到
long
文本,而不是
int
文本。所以你的第一句话有点太宽泛了。阅读它是因为为浮点数定义的标准。阅读更多可能重复的注释,使用
f
后缀,您将获得
float
literal而不是
double
literal。。。使用
L
后缀,可以得到
long
文本,而不是
int
文本。所以你的第一句话有点太宽泛了。真棒的解释,先生!!我从来没有想到10.1(浮点)等于10.1(双精度)是假的(在类型转换后)真棒的解释先生!!我从来没有想到10.1(float)等于10.1(double)(在类型转换之后)是false