Это вызывается ошибкой/функцией в буфере обмена Служб удаленных рабочих столов (и возможные другие вещи) и реализация.NET буфера обмена. Задержка открытия буфера обмена вызывает ошибку, которая обычно передает в нескольких миллисекундах.
решение состоит в том, чтобы попробовать многократно в цикле и промежуточном сне.
for (int i = 0; i < 10; i++)
{
try
{
Clipboard.SetText(str);
return;
}
catch { }
System.Threading.Thread.Sleep(10);
}
str (0,47000000000000003)
give '0,47'
и float ('0,47')
может быть 0,46999999999999997
.
Это связано с тем, как представлены числа с плавающей запятой (см. Статью wikipedia )
Примечание: float (repr (0.47000000000000003))
или eval (repr (0.47000000000000003) ))
даст ожидаемый результат, но вы должны использовать Decimal , если вам нужна точность.
float (и double) не имеют бесконечной точности . Естественно, при работе с ними возникают ошибки округления.
Это FAQ по Python
Тот же вопрос довольно часто возникает также в comp.lang.python .
Я думаю, причина в Часто задаваемые вопросы заключаются в том, что, поскольку python совершенен во всех других отношениях ;-), мы ожидаем, что он будет отлично выполнять арифметические операции - точно так же, как нас учили в школе. Однако любой, кто прошел курс обучения численным методам, скажет вам, что числа с плавающей запятой очень далеки от совершенства.
Десятичное - хорошая альтернатива, и если вам нужно больше скорости и больше возможностей gmpy тоже отлично.