Kyo*_*ang -4 floating-point scala floating-accuracy
为什么Scala中乘法0.3和3的结果是0.89999999999999?
浮点计算是一个相当复杂的主题.
这与浮点数的二进制表示有关,它不能保证每个可能的数字(显然),具有精确的表示,这可能导致操作错误,是的,这些错误可以传播.
这是一个关于这个主题的链接,虽然它不是最简单的东西,如果你想了解这个主题,它可以给你一个很好的视角.
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
底线问题是,对于给定的浮点数,有理数,该数字的二进制表示可能需要比给定语言中的可用精度更高的精度.
例如,如果使用24位来存储double,但浮点值的二进制表示需要25位才能准确表示,则会出现舍入错误.
编辑:
正如PéterTörök在评论中指出的那样,大多数已知的编程语言对公共数据类型使用相同的表示,float- > 32位,double- > 64位,因此通常可以根据数据类型计算精度,无论语言如何.
这不仅仅是Scala中的情况,而是在任何使用IEEE标准的浮点数的语言/平台中.
ruby中的示例:
0.1.9.2p320 :001 > 0.3 * 3
=> 0.8999999999999999
Run Code Online (Sandbox Code Playgroud)
或Python:
>>> 0.3 * 3
0.8999999999999999
Run Code Online (Sandbox Code Playgroud)