Форум сайта python.su
Я не так давно начал изучать Python, и вобщем-то применил свою всегдашнюю методику:
читаем документацию, ищем для себя N десятков маленьких, но интересных полупрактических задачек для тренировки (в этом лично мне очень помогает diofant.ru).
И во время решения одной такой задачки натолкнулся на необъяснимую для меня странность, в написанном алгоритме отделения от числа единиц. То есть число, например, 56 должен представить как 5 и 6; 1268 как 126 и 8 и т.д и т.п.:
Однако оказалось если двухзначное число записано из двух цифр n и n+1 в ответ выдается n, причем во всех остальных случаях все работает без накладок.
Собственно код дающий ошибку:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import math;
y = 12;
z, Buffer = math.modf(y / 10.0);
print z;
z = z * 10;
print z;
z = int(z);
print(z);
x = 2.0;
x = int(2.0);
print x;
lexa@linux-lexa:~> python
Python 2.6 (r26:66714, Dec 3 2008, 10:55:18)
[GCC 4.3.2 [gcc-4_3-branch revision 141291]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> y=12
>>> z, Buffer = math.modf(y / 10.0)
>>> print z
0.2
>>> z = z * 10
>>> print z
2.0
>>> z = int(z)
>>> print z
1
program buben ;
uses crt;
var y : integer;
z : real;
BEGIN
y := 12;
z := frac(y / 10);
writeln(z);
z := z * 10;
writeln(z);
y:=trunc(z);
writeln(y);
END.
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import math;
print "Введено Получено Должно.0";
for y in range(11, 100):
z, Buffer = math.modf(y / 10.0);
z = z * 10;
a = z;
z = int(z);
print str(y) + " ...... " + str(z) + " ...... " + str(a);
Отредактировано (Июль 4, 2009 17:23:25)
Офлайн
>>> import math
>>> y = 12
>>> z, Buffer = math.modf(y / 10.0)
>>> z
0.19999999999999996
>>> z
1.9999999999999996
Офлайн
Хм, замечательно… Я думал о чем-то в этом роде, но меня ввело в заблуждение, что print выводил нормальные 0.2
Но самый главный вопрос тогда как с этим бороться? Полазил по ссылкам, да вопрос поднимался явно часто, и объяснений почему так происходит много, но в основном везде пишут, мол это не ошибка и “небольшие проблемы с округлением” вроде как не проблема. Может быть, конечно но на мой взгляд это уже не “небольшие проблемы”, небольшие проблемы когда ошибка в седьмом знаке после запятой, а не не правильный ответ в арифметике “на пальцах”. Такое с числами пожалуй еще только php творит.
Но ведь пишут же на питоне сложные программы физико-математического плана, значит можно с этим бороться, правильно?
P.S. Пока сижу читаю ман по decimal, надеюсь поможет.
Отредактировано (Июль 4, 2009 18:37:24)
Офлайн
AnkxДля арифметики “на пальцах” вам math без надобности:
Может быть, конечно но на мой взгляд это уже не “небольшие проблемы”, небольшие проблемы когда ошибка в седьмом знаке после запятой, а не не правильный ответ в арифметике “на пальцах”.
Офлайн
2 Ed, спасибо.
Отредактировано (Июль 4, 2009 19:09:58)
Офлайн
__builtins__.round
Офлайн
Ankx, а зачем в каждой строке ставишь ; в конце?! Это же не паскаль…
Офлайн
лол же
>>> divmod(1268, 10)
(126, 8)
Офлайн