java 为何浮点数可能丢失精度?

为何浮点数可能丢失精度?并不是说Java浮点数的精度会丢失,而是存储在二进制中的所有浮点数都可能会丢失精度(有些特殊的十进制值可以精确表示),所以存储在计算机中的浮点数有丢失精度的风险,但是丢失的精度

为何浮点数可能丢失精度?

并不是说Java浮点数的精度会丢失,而是存储在二进制中的所有浮点数都可能会丢失精度(有些特殊的十进制值可以精确表示),所以存储在计算机中的浮点数有丢失精度的风险,但是丢失的精度不会影响我们的正常使用。当小数转换成二进制时,它们不一定用精确的二进制来表示,大多数情况下它们被当作近似值,这会导致精度的损失。如果用二进制进行计算,显然会进一步损失计算结果的准确性。举个简单的例子,0.1用二进制表示(十进制和二进制转换法)(1)0.1×2=0.2,0.0(2)0.2×2=0.4,0.00(3)0.4×2=0.8,0.000(4)0.8×2=1.6,0.0001(5)0.6×2=0.2,0.00011(6)0.2×2=0.4,0.000110(7)0.4×2=0.8取整数0得到0.0001100(8)0.8×2=1.6取整数1得到0.00011001(9)0.6x 2=1.2取整数1得到0.000110011(n)。。。得到一个无限循环的二进制十进制0.000110011没有办法用一个精确的二进制来表示0.1。而且计算机中用来存储浮点数的位数也是有限的,所以我们只能选择以一定的精度保存。当然,也有特殊的小数,比如二进制0.25就是0.01

单精度有1个符号,8个指数和23位小数。

双精度是1号,11指数,52十进制。

单精度十进制在计算机中只有23位(二进制),转换成十进制只能保证6位十进制数字的精度。超过此精度的十进制运算(二进制23,十进制6)将被截取,导致精度损失和计算结果不准确。

同样,双精度,十进制是52(二进制),转换成十进制只能保证15。

Java中单精度和双精度浮点有什么区别?

Float占用4个字节,精度为7位,而double占用8个字节,精度为16位。但是,内存消耗很大。如何使用取决于实际需要。如果你只是学习Java,你不需要深入了解它,以免陷入困境。如果你深入学习,问问度娘。