Java 带特定数字的浮点精度

Java 带特定数字的浮点精度,java,floating-point,floating-accuracy,Java,Floating Point,Floating Accuracy,下面的值给了我错误的精度。只观察到特定的数字。这可能是一个浮动表示问题,但想知道具体原因 String m = "154572.49"; //"154,572.49"; Float f = Float.parseFloat(m); System.out.println(f); 它正在打印的输出是154572.48而不是154572.49如果您希望十进制数的输出与在Java中输入的数字完全相同,请使用而不是浮点 浮点数对于小数来说本质上是不准确的,因为许多以十进制结尾的数字(例如0.1)是二进制

下面的值给了我错误的精度。只观察到特定的数字。这可能是一个浮动表示问题,但想知道具体原因

String m = "154572.49"; //"154,572.49";
Float f = Float.parseFloat(m);
System.out.println(f);

它正在打印的输出是
154572.48
而不是
154572.49

如果您希望十进制数的输出与在Java中输入的数字完全相同,请使用而不是浮点


浮点数对于小数来说本质上是不准确的,因为许多以十进制结尾的数字(例如0.1)是二进制的循环数,浮点数存储为二进制表示形式。

如果希望十进制数的输出与在Java中输入的数字一样准确,请使用而不是浮点

浮点数对于小数来说本质上是不准确的,因为许多以十进制结尾的数字(例如0.1)是二进制的循环数,浮点数存储为二进制表示。

您必须阅读此内容

将无限多个实数压缩成有限位数需要近似表示。尽管有无限多个整数,但在大多数程序中,整数计算的结果可以存储在32位中。相反,给定任何固定的位数,大多数实数计算将产生无法用那么多位数精确表示的量。因此,浮点计算的结果必须经常四舍五入,以适应其有限表示形式。这种舍入误差是浮点计算的特征

你一定要读这个

将无限多个实数压缩成有限位数需要近似表示。尽管有无限多个整数,但在大多数程序中,整数计算的结果可以存储在32位中。相反,给定任何固定的位数,大多数实数计算将产生无法用那么多位数精确表示的量。因此,浮点计算的结果必须经常四舍五入,以适应其有限表示形式。这种舍入误差是浮点计算的特征


Float提供十进制数的基数为2的表示形式。当您解析时,它解析的是十进制数的二进制表示形式,几乎永远不会精确。你可以从它的二进制表示中得到.4856(好吧,我没有做计算,这只是一个猜测,让你明白这个想法)

Float提供十进制数的基数2表示形式。当您解析时,它解析的是十进制数的二进制表示形式,几乎永远不会精确。你可以从它的二进制表示中得到.4856(好吧,我没有做计算,这只是一个猜测,让你明白这个想法)

原因是你不能在有限的内存中表示无限多的数字,比如32位浮点。因此,您总是可以得到最近的可表示数字。原因是您不能在有限的内存中表示无限多个数字,如32位浮点。因此,您将始终获得最接近的可表示数字。感谢您的回复,是的,我非常习惯于
BigDecimal
,但在与第三方库合作时遇到了此问题。感谢您的回复,是的,我非常习惯于
BigDecimal
,但在与第三方库合作时遇到了这个问题。我正在浏览相同的链接。非常感谢。我正在通过相同的链接。非常感谢。谢谢@KMC,是的,我想到了这个主意。。!!谢谢@KMC,是的,我想到了这个主意。。!!