java 中的精度损失
Loss of precision in java
所有整数文字在 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
被转换回 double
,具有与 d
.
不同的值
所有整数文字在 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
被转换回 double
,具有与 d
.