Тест, если число с плавающей точкой является целым числом

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
18
задан BCS 26 September 2008 в 22:20
поделиться

10 ответов

d == Math.Floor(d)

делает то же самое, другими словами.

NB: Надо надеяться, Вы знаете, что необходимо быть очень осторожными при выполнении такого рода вещи; плавает/удваивает очень легко накопит миниатюрные ошибки, которые делают точные сравнения (как этот) сбоем ни по какой очевидной причине.

29
ответ дан 30 November 2019 в 06:12
поделиться

Это работало бы, я думаю:

if (d % 1 == 0) {
  //...
}
6
ответ дан 30 November 2019 в 06:12
поделиться

Если Вашим двойным является результат другого вычисления, Вы, вероятно, хотите что-то как:

d == Math.Floor(d + 0.00001);

Тот путь, если была небольшая погрешность округления, она будет все еще соответствовать.

5
ответ дан 30 November 2019 в 06:12
поделиться

Я не могу ответить на часть C#-specific вопроса, но я должен указать, что Вы, вероятно, пропускаете универсальную проблему с числами с плавающей точкой.

Обычно целочисленность не четко определена на плаваниях. По той же причине, что равенство не четко определено на плаваниях. Вычисления с плавающей точкой обычно включают и округление и ошибки представления.

, Например, 1.1 + 0.6 != 1.7.

Да, это - просто способ, которым работают числа с плавающей точкой.

Здесь, 1.1 + 0.6 - 1.7 == 2.2204460492503131e-16.

Строго говоря, самая близкая вещь к сравнению равенства, которое можно сделать с плаваниями, сравнивает их до выбранной точности .

, Если это не достаточно, необходимо работать с представлением десятичного числа с представлением числа с плавающей точкой со встроенным диапазоном ошибок, или с символьными вычислениями.

5
ответ дан 30 November 2019 в 06:12
поделиться

Вам не нужно дополнительное (двойное) там. Это работает:

if (d == (int)d) {
 //...
}
2
ответ дан 30 November 2019 в 06:12
поделиться

Если Вы просто собираетесь преобразовать его, Mike F / ответ Khoth хорош, но не вполне отвечает на Ваш вопрос. Если Вы собираетесь на самом деле протестировать, и это на самом деле важно, я рекомендую реализовать что-то, что включает предел погрешности.

, Например, если Вы рассматриваете деньги и Вы хотите протестировать даже на суммы в долларах, Вы могли бы сказать (после шаблона Khoth):

if( Math.abs(d - Math.Floor(d + 0.001)) < 0.001)

, Другими словами, примите абсолютное значение различия значения, и это - целочисленное представление, и удостоверьтесь, что это является маленьким.

3
ответ дан 30 November 2019 в 06:12
поделиться

Это позволит Вам выбрать, какую точность Вы ищете, плюс или минус половина галочки, для составления дрейфа с плавающей точкой. Сравнение является неотъемлемой частью также, который хорош.

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
1
ответ дан 30 November 2019 в 06:12
поделиться

Используйте Математику. Усеченный ()

2
ответ дан 30 November 2019 в 06:12
поделиться

Вы могли использовать это

    bool IsInt(double x)
    {
        try
        {
            int y = Int16.Parse(x.ToString());
            return true;
        }
        catch 
        {
            return false;
        }
    }
0
ответ дан 30 November 2019 в 06:12
поделиться

Что-то вроде этого

double d = 4.0;
int i = 4;

bool equal = d.CompareTo(i) == 0; // true
0
ответ дан 30 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: