Java 将精确浮点数丢失为整数

Java 将精确浮点数丢失为整数,java,floating-point,Java,Floating Point,这是真的。为什么它打印为真?我如何防止这种精度损失?浮动范围高端的代表性数字之间的间隔为2124,约为2.028•1031。执行算术运算时,结果四舍五入到最接近的可表示值。向float.MAX\u value添加187的数学值与float.MAX\u value非常接近,因此四舍五入的结果是float.MAX\u value 因此,float.MAX_值-187和float.MAX_值+187相等 在float或double类型中无法更改此项;这就是它们的设计方式。如果您希望更精确地计算,还有其

这是真的。为什么它打印为真?我如何防止这种精度损失?

浮动范围高端的代表性数字之间的间隔为2124,约为2.028•1031。执行算术运算时,结果四舍五入到最接近的可表示值。向
float.MAX\u value
添加187的数学值与
float.MAX\u value
非常接近,因此四舍五入的结果是
float.MAX\u value

因此,
float.MAX_值-187
float.MAX_值+187
相等


float
double
类型中无法更改此项;这就是它们的设计方式。如果您希望更精确地计算,还有其他解决方案,例如使用任意精度的数学软件或重新设计您的计算。

f+i
溢出,而不是丢失精度,考虑<代码>浮点。Max值< /代码>为10 ^ 38的顺序,<代码>浮点< /代码> S只持有相当于7位十进制数字的精度。因此,在这种量级上,不同的
float
值彼此相差大约10^30或10^31。因此,加上或减去一些小到187(10^2的数量级)的东西对如此巨大的数量的影响,与从太平洋取一茶匙水对太平洋总水量的影响差不多:即几乎没有。@cricket_007:这不是溢出。根据IEEE 754,在考虑指数范围之前,当舍入结果超过可表示的最大有限数时,会发生溢出。
float.MAX_值
加187的正常四舍五入产生
float.MAX_值
,因此没有溢出。
int i=187;
float f=Float.MAX_VALUE;

System.out.println((f-i)==(f+i)) ;