2017-04-05 42 views
3
var num1 = 1.1 
if num1 + 0.1 == 1.2 {print("true")} else {print("false")} 

结果:false令人惊讶的差异

var num1: Float = 1.1 
if num1 + 0.1 == 1.2 {print("true")} else {print("false")} 

结果:true

的代码前者块具有NUM1它代表一个双键和后者码块有num1代表一个浮动。

我的问题:为什么带Float的代码返回true,而带Double的代码不?

+0

@Leo Dabus你建议的那个不回答我的问题。我知道它讨论的是浮点数的精度,但没有讨论的部分提到为什么float返回true而double不是。所以请再考虑并从我的问题中删除重复。 – THCoder

+0

浮点数为单精度,双精度为双精度。 –

+0

@Leo Dabus我认为这是一个有效的问题,我对“Float”和“Double”之间的差异感到好奇。如果有什么,它应该是相反的... –

回答

1

This is a duplicate and I will close it as such as,but here is a example of why why this work for Float but not for Double

而不是看DoubleFloat,让我们看看两种新的类型。 EighthsSixteenthsEighths有3位表示小数,这样你就可以代表00.1250.250.3750.50.6250.750.875Sixteenths有4位来表示分数,因此您可以表示0,0.06250.125,0.1875,0.25等等。在这两种数字类型中,都需要通过选择最接近您想要表示的值来近似浮点值。

让我们来看看1.1 + 0.1EighthsSixteenths之间的样子。

八分

1.1 = 1.125 
0.1 = 0.125 
1.2 = 1.25 

1.1 + 0.1 = 1.125 + 0.125 = 1.25 

所以1.1 + 0.1 == 1.2Eighths

十六分之

1.1 = 1.125 
0.1 = 0.125 
1.2 = 1.1875 

1.1 + 0.1 = 1.125 + 0.125 = 1.25 

所以1.1 + 0.1 != 1.2Sixteenths

Sixteenths的更高的精度使得有可能以较小的值时在Sixteenths表示更精确地表示1.2

这就是Float s和Double s发生的情况。有更多的位可用于表示数字,但它们仍然是近似值。当用这些近似值进行数学运算时,误差会以意想不到的方式结合起来,这就是为什么建议使用与浮点值进行等值比较的原因。

+0

感谢您的回答!如果我不能使用等于比较,我可以知道如何比较浮点数吗? – THCoder

+0

这很有趣:http://stackoverflow.com/a/4915891/1630618 – vacawama

相关问题