2013-12-07 8 views
0

Я просто спросил, почему python дает значение 3.3 - 1.1 2.1999999999999997. Я думаю, потому что 3.3 или 1.1 представлены в базе 2, не так ли? По крайней мере, мое мнение было правильным http://docs.python.org/2/tutorial/floatingpoint.html. Но в этом случае 3.3 и 1.1 не могут быть представлены точно как двоичные дроби, поэтому ответ примерно не точным. Но почему python дает 3.3 + 1.1 = 4.4, а 3.3 - 1.1 = 2.1999999999999997, почему бы ему не дать 4.3999999999997 в частности?Операция с плавающей запятой снова

ответ

4

4.4 также не является точным. Вам просто нужно напечатать его с более высокой точностью, чтобы увидеть это:

In [2]: '%.20f' % (3.3 + 1.1) 
Out[2]: '4.40000000000000035527' 
+0

Хорошо, я вижу, но почему 3.3 - 1.1 печатается 2.1999999999999997 не 2.2? – Yagami

+0

Я думаю, нам не нужно преодолевать эту проблему, возможно, программа python работает так, по крайней мере, я знаю, что 4.4 4.4.20000000000000035527, но если у вас есть мнение, прокомментируйте. – Yagami

+0

Поскольку Python печатает кратчайшую десятичную строку, которая будет воспроизводить двоичный float точно при чтении. '2.2 == 2.199999999999999997'' 'False'. –

2

Чтобы увидеть точное значение, соответствующее двоичному поплавка, используйте decimal модуль. Например,

>>> import decimal 
>>> decimal.Decimal(3.3 + 1.1) 
Decimal('4.4000000000000003552713678800500929355621337890625') 

Примечание асимметрии: в то время как большинство десятичных поплавки не могут быть точно представлены в виде двоичных поплавков, все бинарные поплавки может быть точно представлены в виде десятичных поплавков. Это «в основном потому, что» 0,1 двоичный код равен ровно 0,5 десятичным, но 0,1 десятичное значение не может быть точно выражено как (конечный) двоичный float.

Смежные вопросы