transposedAsdf = as.list(as.data.frame(t(as.data.frame(asdf))))
transposedAsdf
$V1
[1] 1 10
$V2
[1] 2 20
$V3
[1] 3 30
$V4
[1] 4 40
$V5
[1] 5 50
d == Math.Floor(d)
делает то же самое, другими словами.
NB: Надо надеяться, Вы знаете, что необходимо быть очень осторожными при выполнении такого рода вещи; плавает/удваивает очень легко накопит миниатюрные ошибки, которые делают точные сравнения (как этот) сбоем ни по какой очевидной причине.
Если Вашим двойным является результат другого вычисления, Вы, вероятно, хотите что-то как:
d == Math.Floor(d + 0.00001);
Тот путь, если была небольшая погрешность округления, она будет все еще соответствовать.
Я не могу ответить на часть C#-specific вопроса, но я должен указать, что Вы, вероятно, пропускаете универсальную проблему с числами с плавающей точкой.
Обычно целочисленность не четко определена на плаваниях. По той же причине, что равенство не четко определено на плаваниях. Вычисления с плавающей точкой обычно включают и округление и ошибки представления.
, Например, 1.1 + 0.6 != 1.7
.
Да, это - просто способ, которым работают числа с плавающей точкой.
Здесь, 1.1 + 0.6 - 1.7 == 2.2204460492503131e-16
.
Строго говоря, самая близкая вещь к сравнению равенства, которое можно сделать с плаваниями, сравнивает их до выбранной точности .
, Если это не достаточно, необходимо работать с представлением десятичного числа с представлением числа с плавающей точкой со встроенным диапазоном ошибок, или с символьными вычислениями.
Вам не нужно дополнительное (двойное) там. Это работает:
if (d == (int)d) {
//...
}
Если Вы просто собираетесь преобразовать его, Mike F / ответ Khoth хорош, но не вполне отвечает на Ваш вопрос. Если Вы собираетесь на самом деле протестировать, и это на самом деле важно, я рекомендую реализовать что-то, что включает предел погрешности.
, Например, если Вы рассматриваете деньги и Вы хотите протестировать даже на суммы в долларах, Вы могли бы сказать (после шаблона Khoth):
if( Math.abs(d - Math.Floor(d + 0.001)) < 0.001)
, Другими словами, примите абсолютное значение различия значения, и это - целочисленное представление, и удостоверьтесь, что это является маленьким.
Это позволит Вам выбрать, какую точность Вы ищете, плюс или минус половина галочки, для составления дрейфа с плавающей точкой. Сравнение является неотъемлемой частью также, который хорош.
static void Main(string[] args)
{
const int precision = 10000;
foreach (var d in new[] { 2, 2.9, 2.001, 1.999, 1.99999999, 2.00000001 })
{
if ((int) (d*precision + .5)%precision == 0)
{
Console.WriteLine("{0} is an int", d);
}
}
}
и вывод
2 is an int
1.99999999 is an int
2.00000001 is an int
Вы могли использовать это
bool IsInt(double x)
{
try
{
int y = Int16.Parse(x.ToString());
return true;
}
catch
{
return false;
}
}
Что-то вроде этого
double d = 4.0;
int i = 4;
bool equal = d.CompareTo(i) == 0; // true