为什么2个浮点数之间的这种简单划分不适用于java?

时间:2010-04-26 13:56:35

标签: java floating-point division

System.out.println((26.55f/3f));

System.out.println((float)( (float)26.55 / (float)3.0 ));

返回结果8.849999。不应该是8.85。

任何人都可以解释这一点,还是我们都应该避免使用花车?

4 个答案:

答案 0 :(得分:8)

What Every Programmer Should Know About Floating-Point Arithmetic

  问:为什么我的数字不一样,比如0.1 + 0.2   加起来好一轮0.3,和   相反,我得到一个奇怪的结果,如   0.30000000000000004?

     

答:因为在内部,计算机使用的是   格式(二进制浮点)   无法准确表示一个数字   像0.1,0.2或0.3一样。

链接到站点的深入解释

答案 1 :(得分:2)

查看维基百科关于浮点的文章,特别是Accuracy Problems部分。

  

浮点数的事实   不能准确地代表所有真实的   数字和那个浮点数   操作无法准确表示   真正的算术运算,导致   许多令人惊讶的情况。这是   与有限精度有关   哪些计算机通常代表   号。

本文介绍了一些应该提供更清晰的示例。

答案 2 :(得分:2)

解释很简单:浮点数是一种二进制格式,因此只能表示某个自然整数1.0 / (2 to the Nth power)的{​​{1}}整数倍的值。 N没有此属性,因此无法准确表示。

如果你需要精确的代表(例如你的代码是关于会计和金钱,每一分钱的重要部分),那么你必须确实避免使用浮点数来支持其他类型,这些类型确保准确表示你需要的值(取决于例如,在您的应用程序中,只需按整数分数进行所有会计就足够了)。浮动(当适当使用和建议使用时! - )对于工程和科学计算来说非常好,其中输入值在任何情况下都不会“无限精确”,因此精确表示的计算繁琐负担绝对不值得。

答案 3 :(得分:0)

嗯,我们都应该避免在现实的地方使用花车,但那是另一天的故事。

问题在于浮点数不能完全代表我们认为在呈现中微不足道的大多数数字。 8.850000可能无法用浮点数完全表示;也可能不是双倍的。这是因为它们不是实际十进制数;但是二进制表示。