Java 如果将数据类型long分配给数据类型float,为什么会出现舍入错误?

Java 如果将数据类型long分配给数据类型float,为什么会出现舍入错误?,java,types,rounding,precision,Java,Types,Rounding,Precision,我老师的问题是: 写下可能发生舍入错误的作业。 这是用Java编写的 float f; long l; double d; f = l; d = l; 这就是答案,但为什么呢?float的值和最大值较高,float是一个浮点数。相比之下,long只是一个整数,为什么会有舍入误差呢?浮点数的绝对值越大,精确度就越低。超过某个点后,最接近的两个可精确表示的浮点数之间的差值大于1 或者反过来看,查看与Long.MAX\u值最近的float表示。现在查看与Long.MAX_值-1最近的float表示

我老师的问题是: 写下可能发生舍入错误的作业。 这是用Java编写的

float f;
long l;
double d;

f = l;
d = l;

这就是答案,但为什么呢?float的值和最大值较高,float是一个浮点数。相比之下,long只是一个整数,为什么会有舍入误差呢?

浮点数的绝对值越大,精确度就越低。超过某个点后,最接近的两个可精确表示的浮点数之间的差值大于1

或者反过来看,查看与
Long.MAX\u值
最近的
float
表示。现在查看与
Long.MAX_值-1
最近的
float
表示形式


除此之外,您应该能够计算出并非每个
long
都可以通过数据类型的大小表示为
float
:对于
float
,有232种可能的位模式(并非所有都是正常数)浮点数的264个可能的位模式在绝对值上随着它们变大而变得不那么精确。超过某个点后,最接近的两个可精确表示的浮点数之间的差值大于1

或者反过来看,查看与
Long.MAX\u值
最近的
float
表示。现在查看与
Long.MAX_值-1
最近的
float
表示形式


除此之外,您应该能够计算出,并非每个
long
都可以通过数据类型的大小表示为
float
:对于
float
,有232种可能的位模式(并非所有都是正常数)和264种可能的
long
位模式原因:float 32位,long在java中是64位的原因:float 32位,long在java中是64位的,这在IMO中不够详细-因为对于
double
也是如此,对于80位浮点类型也很容易如此。这在IMO中不够详细-因为对于
double
也是如此,对于80位浮点类型,这很容易实现。我试着按照你说的做,但得到了相同的值:f=Long.MAX\u;系统输出打印ln(f);f=Long.MAX_值-1;系统输出打印ln(f)@斯凯勒:现在想想为什么会这样。我试着按照你说的做,但是我得到了相同的值:f=Long.MAX\u;系统输出打印ln(f);f=Long.MAX_值-1;系统输出打印ln(f)@斯凯勒:现在想想为什么会这样。